Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenMP-循环中最简单的累加器给出不正确的结果 我使用英特尔C++编译器,在16个线程上运行程序。我希望第一个循环并行运行。“计数”的结果应该是30000000,我猜。然而,结果却不到3000万。臭虫在哪里?谢谢 #include <stdio.h> #include <omp.h> int main(){ long count = 0; #pragma omp parallel { #pragma omp for for (long i = 0; i < 10000000; i++){ for (int j = 0; j < 3; j++){ count++; } } } printf("%d", count); } #包括 #包括 int main(){ 长计数=0; #pragma-omp并行 { #pragma omp for 对于(长i=0;i被原子化应用。_C++_Multithreading_Openmp - Fatal编程技术网

OpenMP-循环中最简单的累加器给出不正确的结果 我使用英特尔C++编译器,在16个线程上运行程序。我希望第一个循环并行运行。“计数”的结果应该是30000000,我猜。然而,结果却不到3000万。臭虫在哪里?谢谢 #include <stdio.h> #include <omp.h> int main(){ long count = 0; #pragma omp parallel { #pragma omp for for (long i = 0; i < 10000000; i++){ for (int j = 0; j < 3; j++){ count++; } } } printf("%d", count); } #包括 #包括 int main(){ 长计数=0; #pragma-omp并行 { #pragma omp for 对于(长i=0;i被原子化应用。

OpenMP-循环中最简单的累加器给出不正确的结果 我使用英特尔C++编译器,在16个线程上运行程序。我希望第一个循环并行运行。“计数”的结果应该是30000000,我猜。然而,结果却不到3000万。臭虫在哪里?谢谢 #include <stdio.h> #include <omp.h> int main(){ long count = 0; #pragma omp parallel { #pragma omp for for (long i = 0; i < 10000000; i++){ for (int j = 0; j < 3; j++){ count++; } } } printf("%d", count); } #包括 #包括 int main(){ 长计数=0; #pragma-omp并行 { #pragma omp for 对于(长i=0;i被原子化应用。,c++,multithreading,openmp,C++,Multithreading,Openmp,您已经编写了一个规范的数据竞赛程序。程序中的所有线程都在争先恐后地更新变量count,并且无法保证每个线程读取、更新、然后将值写入变量的顺序。无论你相信C++,都不能保证 ++>代码>被原子化应用。 您应该继续阅读OpenMP教程,了解共享(和私有)变量,以及缩减 如果您在此处搜索,您应该会找到类似的问题,其中一些问题的答案包括向您演示如何执行您正在尝试执行的操作的代码。您还可以通过插入以下内容来指示omp以原子方式执行增量: #pragma omp atomic 在您的count++行之前

您已经编写了一个规范的数据竞赛程序。程序中的所有线程都在争先恐后地更新变量
count
,并且无法保证每个线程读取、更新、然后将值写入变量的顺序。无论你相信C++,都不能保证<代码> ++>代码>被原子化应用。 您应该继续阅读OpenMP教程,了解共享(和私有)变量,以及缩减


如果您在此处搜索,您应该会找到类似的问题,其中一些问题的答案包括向您演示如何执行您正在尝试执行的操作的代码。

您还可以通过插入以下内容来指示omp以原子方式执行增量:

 #pragma omp atomic

在您的count++行之前。然后您将避免HPM前面描述的竞争条件。请参见或

根据我对OpenMP的有限理解,标有
#pragma omp for
的循环的每个操作必须相互独立。@C.R.“独立”是什么意思?我的代码怎么了?谢谢。可以强制使用原子增量,但这样做实际上会使计算序列化。无可否认,我没有使用“pragma OMP parallel for”之外的任何OMP,因此我不熟悉其内部和外部-可能如HPM所建议的,缩减比原子更好。我假设最终的代码在增量之前或之后会做一些有用的事情,这仍然是并行的,并且计数可以是原子的。否则,两个循环都可以替换为count+=30000000;