Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
Parallel processing 在旧版本上减少OpenMP而不过载 #pragma omp parallel for//I want reduce,但重载在所使用的版本上不起作用 对于(inti=0;i_Parallel Processing_Openmp_Reduction - Fatal编程技术网

Parallel processing 在旧版本上减少OpenMP而不过载 #pragma omp parallel for//I want reduce,但重载在所使用的版本上不起作用 对于(inti=0;i

Parallel processing 在旧版本上减少OpenMP而不过载 #pragma omp parallel for//I want reduce,但重载在所使用的版本上不起作用 对于(inti=0;i,parallel-processing,openmp,reduction,Parallel Processing,Openmp,Reduction,,在这种情况下,最好的办法是交换循环 #pragma omp parallel for for (j=0; j < 102342; j++) for (int i = 0; i <= min(j,499); i++) Output[j] += staticConstant[i] * data[j-i]; #pragma omp parallel for 对于(j=0;j

,在这种情况下,最好的办法是交换循环

#pragma omp parallel for
for (j=0; j < 102342; j++)
   for (int i = 0; i <= min(j,499); i++)
        Output[j] += staticConstant[i] * data[j-i];
#pragma omp parallel for
对于(j=0;j<102342;j++)

对于(int i=0;i忘记在这种情况下使用缩减,与并行化的效果相比,它将产生的开销(缩减变量中100000+个元素)可能会扼杀大部分收益。只需坚持简单的并行化结构

理想情况下,您希望将
j
循环并行化,因为它在迭代之间没有依赖关系。因此您可以这样做:

#pragma omp并行
对于(int i=0;i<500;i++){
#pragma omp for
对于(int j=i;j<102342;j++){
输出[j]+=静态常数[i]*数据[j-i];
}
}
对于像这样简单的代码,这就足够了

现在,您可能需要更进一步,尝试交换
i
j
循环,以提高并行化效率(但不确定这会有多大不同)。为此,您需要在
j
循环初始化中删除对
i
的依赖关系。下面是一种方法:

//首先让我们在j中进行依赖迭代
对于(int i=0;i<500;i++){
对于(int j=i;j<500;j++){
输出[j]+=静态常数[i]*数据[j-i];
}
}
//然后进行所有其他迭代,交换i和j循环
//现在我们可以并行化了,没问题
#pragma-omp并行
对于(int j=500;j<102342;j++){
对于(int i=0;i<500;i++){
输出[j]+=静态常数[i]*数据[j-i];
}
}
#pragma omp parallel for
for (int i = 0; i <500; i++)
   for (j=i; j < 102342; j++)
    {
      #pragma omp atomic
      Output[j] += staticConstant[i] * data[j-i];
    }