非嵌套for循环?

时间:2015-12-01 10:55:08

标签: c parallel-processing openmp

如何使用openmp并行化非嵌套for循环?

1 个答案:

答案 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;
    }
}

你会注意到我做了一些改动。其中,变量的延迟声明,例如ijindex_Xindex_Y非常重要,因为变量现在是private 。在您的代码中,这些用于在函数的开头声明。您可以使用private( i, j, index_X, index_Y )子句向parallel指令显式声明每个线程私有。但是,在parallel区域内声明它们的错误要小得多,我建议您始终这样做(即使不尝试并行化代码)。

此代码适合您吗?