如何使用openmp并行化非嵌套for循环?
答案 0 :(得分:1)
以下是并行化此功能的一种可能方法:
void func1( int *seed, int *array, double *arrayX, double *arrayY,
double *probability, double *objxy, int *index,
int Ones, int iter, int X, int Y, int Z, int n ) {
const int max_size = X * Y * Z;
#pragma omp parallel for
for ( int i = 0; i < n; i++ ) {
arrayX[i] += 1 + 5 * rand2( seed, i );
arrayY[i] += -2 + 2 * rand2( seed, i );
}
#pragma omp parallel for
for ( int i = 0; i < n; i++ ) {
for( int j = 0; j < Ones; j++ ) {
int index_X = round( arrayX[i] ) + objxy[j * 2 + 1];
int index_Y = round( arrayY[i] ) + objxy[j * 2];
index[i * Ones + j] = fabs( index_X * Y * Z + index_Y * Z + iter );
if ( index[i * Ones + j] >= max_size ) {
index[i * Ones + j] = 0;
}
}
double probI = 0;
for ( int j = 0; j < Ones; j++ ) {
probI += ( pow( array[index[i*Ones + j]] - 100, 2 ) -
pow( array[index[i*Ones + j]] - 228, 2 ) ) / 50.0;
}
probability[i] = probI / Ones;
}
}
你会注意到我做了一些改动。其中,变量的延迟声明,例如i
,j
,index_X
和index_Y
非常重要,因为变量现在是private
。在您的代码中,这些用于在函数的开头声明。您可以使用private( i, j, index_X, index_Y )
子句向parallel
指令显式声明每个线程私有。但是,在parallel
区域内声明它们的错误要小得多,我建议您始终这样做(即使不尝试并行化代码)。
此代码适合您吗?