【发布时间】:2018-05-25 16:14:48
【问题描述】:
以下是计算素数的简单代码:
#define END 100000000
// Only pass odd values to this function
int is_prime(uint32_t v)
{
uint32_t end = sqrt(v);
for (uint32_t i = 3; i <= end; i += 2) {
if ((v % i) == 0) {
return 0;
}
}
return 1;
}
int main(int argc, char **argv)
{
// We'll grab 2 as it's the only even prime
int prime_count = 1;
uint32_t bracket = 10;
#pragma omp parallel for num_threads(4)
for (uint32_t i = 3; i < END; i += 2) {
if (i > bracket) {
printf("%12d\t%12d\n", bracket, prime_count);
bracket *= 10;
}
if (is_prime(i)) {
prime_count++;
}
}
printf("%12d\t%12d\n", bracket, prime_count);
return 0;
}
我们的任务是使用 OpenMP pragma 来加快计算速度,因为循环遍历 100,000,000 个整数需要很长时间。我尝试将#pragma 语句放在我粘贴的代码中我当前拥有的位置,当我运行代码时,我得到以下输出:
10 4
10 1
10 4
10 4
100 25
1000 25
10000 25
100000 25
10000000 262
1410065408 5737822
显然认为这是不正确的,我尝试在 is_prime() 函数中的 for 循环上方放置一个#pragma,但我得到编译器错误提示
错误:“到/从 OpenMP 结构化块的无效分支”。
我意识到这个错误来自可能进入 if 语句并在并行操作中间返回 0 的线程。线程提前终止,整个操作分开。我觉得将#pragma 放在函数调用中是最合适的,因为它可以将每次调用函数的运行时间减少v/4。但是,我不知道执行此操作的正确语法。如果有人可以请帮助我,我将不胜感激。谢谢
【问题讨论】:
标签: c multithreading parallel-processing openmp