非嵌套 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;
    }
}

您会注意到我在这里做了一些更改。其中,ijindex_Xindex_Y等变量的后期声明非常重要,因为变量现在是private .在您的代码中,这些用于在函数的开头声明。您可以使用 private( i, j, index_X, index_Y ) 子句向 parallel 指令显式声明它们是每线程私有的。但是,在 parallel 区域内声明它们更不容易出错,我鼓励您始终这样做(即使不尝试并行化代码)。

此代码对您有用吗?