Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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
C++;给出不同结果的多线程 我在C++中有点多线程,我只是尝试使用OMP来完成一些简单的for循环。具体来说,对于此函数,用户指定大小n的数组将填充0到99(包括0到99)之间的随机整数。然后使用正常的for循环和pragma omp parallel for循环计算该数组的和。由于某种原因,当n变大时,函数返回的结果不同。例如,当n=10时,输出如下: REGULAR FOR LOOP SUM: 1216 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 1216 OMP FOR LOOP RUNNING TIME: 0.000205 REGULAR FOR LOOP SUM: 4946 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 3999 OMP FOR LOOP RUNNING TIME: 0.000247_C++_Multithreading_For Loop_Openmp_Pragma - Fatal编程技术网

C++;给出不同结果的多线程 我在C++中有点多线程,我只是尝试使用OMP来完成一些简单的for循环。具体来说,对于此函数,用户指定大小n的数组将填充0到99(包括0到99)之间的随机整数。然后使用正常的for循环和pragma omp parallel for循环计算该数组的和。由于某种原因,当n变大时,函数返回的结果不同。例如,当n=10时,输出如下: REGULAR FOR LOOP SUM: 1216 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 1216 OMP FOR LOOP RUNNING TIME: 0.000205 REGULAR FOR LOOP SUM: 4946 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 3999 OMP FOR LOOP RUNNING TIME: 0.000247

C++;给出不同结果的多线程 我在C++中有点多线程,我只是尝试使用OMP来完成一些简单的for循环。具体来说,对于此函数,用户指定大小n的数组将填充0到99(包括0到99)之间的随机整数。然后使用正常的for循环和pragma omp parallel for循环计算该数组的和。由于某种原因,当n变大时,函数返回的结果不同。例如,当n=10时,输出如下: REGULAR FOR LOOP SUM: 1216 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 1216 OMP FOR LOOP RUNNING TIME: 0.000205 REGULAR FOR LOOP SUM: 4946 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 3999 OMP FOR LOOP RUNNING TIME: 0.000247,c++,multithreading,for-loop,openmp,pragma,C++,Multithreading,For Loop,Openmp,Pragma,当n=100时,输出如下: REGULAR FOR LOOP SUM: 1216 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 1216 OMP FOR LOOP RUNNING TIME: 0.000205 REGULAR FOR LOOP SUM: 4946 REGULAR FOR LOOP RUNNING TIME: 0.000003 OMP FOR LOOP SUM: 3999 OMP FOR LOOP RUNN

n=100
时,输出如下:

REGULAR FOR LOOP SUM: 1216
REGULAR FOR LOOP RUNNING TIME: 0.000003

OMP FOR LOOP SUM: 1216
OMP FOR LOOP RUNNING TIME: 0.000205
REGULAR FOR LOOP SUM: 4946
REGULAR FOR LOOP RUNNING TIME: 0.000003

OMP FOR LOOP SUM: 3999
OMP FOR LOOP RUNNING TIME: 0.000247
这是我的
常规for循环的代码

int sum = 0;
  for(int i = 0; i < n; i++) {
    sum += A[i];
  }
  return(sum);
int sum = 0;
  int i;
#pragma omp parallel shared(A, n) private(i) num_threads(4)
  {
    #pragma omp for
    for(i = 0; i < n; i++) {
      sum += A[i];
    }
  }
  return(sum);

为什么
OMP FOR LOOP
n=100
返回不同的总和?另外,为什么
OMP for LOOP
的运行时间大于
REGULAR for LOOP
?多线程不是减少运行时间的关键吗?

对于
sum
,您有一个竞争条件:

sum += A[i];
在这里,多线程从
sum
读取数据并从中写入一个新值。如果另一个线程基于一个即将被另一个线程覆盖的值执行其增量,则可能会丢失一些增量


这里需要互斥或使用原子增量。

对于第二部分,在使用OMP时,必须生成新线程,这会增加开销。多线程只有在开销小于仅执行循环的成本时才具有优势。尝试数十亿的数字,你可能会得到不同。也就是说,在矢量化的情况下,一个简单的循环在某种程度上已经是并行的了。这两个数组之间的数组是否相同?如果省略了必需的reduce子句any,则该问题可能会被重新表述为为什么不使用reduce子句。如果您对获得性能感兴趣,那么问题会变得更加复杂。即使在循环计数为100的情况下,simd优化也可能无法实现,omp并行可能会失去性能。对于仅依赖于编译器的simd优化,omp simd缩减可能无法像自动矢量化那样工作。@Zulan对此的公认答案实际上是可行的。看来削减条款是必要的。