Using openMP to get the index of minimum element parallelly

前端 未结 3 1534
时光取名叫无心
时光取名叫无心 2021-02-06 10:00

I tried to write this code

float* theArray; // the array to find the minimum value
int   index, i;
float thisValue, min;

index    = 0;
min = theArray[0];
#pragm         


        
3条回答
  •  一向
    一向 (楼主)
    2021-02-06 10:20

    I don't know of an elegant want to do a minimum reduction and save an index. I do this by finding the local minimum and index for each thread and then the global minimum and index in a critical section.

    index = 0;
    min = theArray[0];
    #pragma omp parallel
    {
        int index_local = index;
        float min_local = min;  
        #pragma omp for nowait
        for (i = 1; i < size; i++) {        
            if (theArray[i] < min_local) {
                min_local = theArray[i];
                index_local = i;
            }
        }
        #pragma omp critical 
        {
            if (min_local < min) {
                min = min_local;
                index = index_local;
            }
        }
    }
    

    With OpenMP 4.0 it's possible to use user-defined reductions. A user-defined minimum reduction can be defined like this

    struct Compare { float val; sizt_t index; };    
    #pragma omp declare reduction(minimum : struct Compare : omp_out = omp_in.val < omp_out.val ? omp_in : omp_out)
    

    Then the reduction can be done like this

    struct Compare min; 
    min.val = theArray[0]; 
    min.index = 0;
    #pragma omp parallel for reduction(minimum:min)
    for(int i = 1; i

    That works for C and C++. User defined reductions have other advantages besides simplified code. There are multiple algorithms for doing reductions. For example the merging can be done in O(number of threads) or O(Log(number of threads). The first solution I gave does this in O(number of threads) however using user-defined reductions let's OpenMP choose the algorithm.

提交回复
热议问题