【发布时间】:2019-11-01 15:07:36
【问题描述】:
我有一个简单的for-loop,它根据
数组X[n][d]的对应行。
array *function(X, n, d){
double *array = calloc(n,sizeof(double));
//#pragma omp parallel
{
//#pragma omp parallel for if(n>15000)
for( i=0 ; i<n-1; i++)
{
//#pragma omp parallel for shared(X,j, i) reduction(+: sum)
//#pragma omp parallel for if(d>100) reduction(+:distances[:n]) private(j)
for ( j=0; j< d; j++)
{
array[i] += (pow(X[(j+1)*n-1]-X[j*n+i], 2));
}
array[i] = sqrt(array[i]);
}
}
return array;
}
认为n 与n=100000 一样高,d 可以具有从d=2 到d=100 的预定义值。 function() 在每次 kth 迭代中被多次调用 (2^k)。所以模式是:在第一次迭代它被调用一次,在第二次迭代它被调用两次,在第三次迭代它被调用四次等等......而且n在每次迭代中减少一个(n-=1 )。
我尝试了 openmp 指令的不同组合,这些指令作为 cmets 放入示例代码中,但无论我尝试了什么,代码在没有 openmp 指令的情况下执行相同或更好。
使用openmp提高上述循环的时间性能有哪些好的方法/技术?
【问题讨论】:
-
你检查过非openmp(但经过优化)生成的代码吗?如今的编译器非常擅长优化,这可能会造成一些差异。另一件可能相关的事情是使用 OpenMP 时线程之间的缓存和缓存一致性。
-
我正在使用
-O3优化标志进行编译。我怎么能检查优化的代码呢?我唯一知道的是我手写的顺序部分。 -
你为什么要对一个值进行平方然后取其平方根?
√(x²)是x... -
@Shawn 这是一个错字。我道歉
-
您现在确定您的代码了吗?什么是
distances,它与array有什么联系?
标签: c loops for-loop nested openmp