2016-02-03 33 views
2

我试图编写一个小型C程序来弄清楚OpenMP如何工作。这个例子应该计算1到1000之和;然而,它在终端打印出0。我只能在#pragma的东西出来后才能得到想要的结果。有人可能会告诉我原因吗?OpenMP如何在内部工作

This guide表示#pragma omp for将for循环的工作划分为当前团队的线程。它不会创建线程,它只会将工作分配给当前正在执行的团队的线程。所以我们应该在整个执行过程中只有一个主线程,对吗?

#include <stdio.h> 

int main() { 

    int n, sum = 0; 
    #pragma omp for 
    for (n = 0; n <1000; n++) { 
     sum += n; 
    } 

    printf("%d\n"); 
    return 0; 
} 

回答

4

您有这样一个简单的例子几个问题...

1)你是不是开始并行区域。为此,请使用omp parallel for而不是仅使用omp for

2)您的变量没有被设置为专用于在不同循环中工作的每个线程。所以每个线程都会覆盖每个其他线程版本的变量。具体来说n需要制作成私人。

3)您正试图在多个线程之间求和一个共享变量。这必须用reduction条款完成。

4)您不打印任何内容。您的printf()语法原样不会打印出正确的结果。

所以,你的例子实际上应该是这样的:

int n, sum = 0; 
#pragma omp parallel for private(n) reduction(+:sum) 
for (n = 0; n < 1000; n++) { 
    sum += n; 
} 

printf("%d\n", sum); 

我强烈建议你看看一个基本的OpenMP教程(网上或书)。只需要一点研究,前三个问题就会显而易见。

+0

这是我第一天开始学习并行编程,感谢您指出这些错误。你有没有在线推荐的书籍或幻灯片?我发现的大多数材料都假设读者在这个领域有一些相关的经验.. –

+0

@YufanFei [这是一个很好的教程](https://computing.llnl.gov/tutorials/openMP/),我已经提到几次。虽然在我看来这本书的最好的书是[这一个](http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022)。非常方便新人。 – NoseKnowsAll

+0

相关的for循环中的循环变量被预先确定为“private”,因此private(n)是多余的。 –