试图让一个简单的OpenMP循环,但我不断得到奇怪的输出。它不会从1到1000直接列出,但是从501到750,然后是1到1000.我猜是否存在线程问题?我正在VS2013上编译和运行。
#include <stdio.h>
#include <math.h>
int main(void)
{
int counter = 0;
double root = 0;
// OPEN MP SECTION
printf("Open MP section: \n\n");
getchar(); //Pause
#pragma omp parallel for
for (counter = 0; counter <= 1000; counter++)
{
root = sqrt(counter);
printf("The root of %d is %.2f\n", counter, root);
}
return(0);
}
答案 0 :(得分:3)
OpenMP的整个点是并行运行的东西,将工作分配给不同的执行引擎。
因此,循环的各个迭代很可能是乱序完成的,因为这是多线程的本质。
虽然计算并行完成(因此可能无序)可能是有意义的,但这并不是你想要的打印 of results。
确保以正确顺序打印结果的一种方法是将打印推迟到之后并行执行完成。换句话说,并行计算,但序列化输出。
这当然意味着能够在并行操作运行时将信息存储在例如数组中。
换句话说,比如:
// Make array instead of single value.
double root[1001];
// Parallelise just the calculation bit.
#pragma omp parallel for
for (counter = 0; counter <= 1000; counter++)
root[counter] = sqrt(counter);
// Leave the output as a serial operation,
// once all parallel operations are done.
for (counter = 0; counter <= 1000; counter++)
printf("The root of %d is %.2f\n", counter, root[counter]);
答案 1 :(得分:1)
将结果存储在数组中,并使printf
退出循环。它必须序列化到显示器。
答案 2 :(得分:0)
您的代码不会按顺序运行。
OpenMP Parallel Pragma:
#pragma omp parallel
{
// Code inside this region runs in parallel.
printf("Hello!\n");
}
'此代码创建一个线程组,每个线程执行相同的代码。它打印文本“你好!”接下来是换行符,就像团队中创建的线程一样多次。对于双核系统,它将输出两次文本。 (注意:它也可能输出类似“HeHlellolo”的东西,具体取决于系统,因为打印是并行发生的。)在},线程被连接回一个,就像在非线程程序中一样。“''