非嵌套 for 循环?
non-nested for loop?
如何使用 openmp 并行化非嵌套 for 循环?
这是并行化此函数的一种可能方法:
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
区域内声明它们更不容易出错,我鼓励您始终这样做(即使不尝试并行化代码)。
此代码对您有用吗?
如何使用 openmp 并行化非嵌套 for 循环?
这是并行化此函数的一种可能方法:
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
区域内声明它们更不容易出错,我鼓励您始终这样做(即使不尝试并行化代码)。
此代码对您有用吗?