OpenMP in C array reduction / parallelize the code

烈酒焚心 提交于 2021-02-05 08:49:26

问题


I have a problem with my code, it should print number of appearances of a certain number.

I want parallelize this code with OpenMP, and I tried to use reduction for arrays but it's obviously didn't working as I wanted.

The error is: "segmentation fault". Should some variables be private? or it's the problem with the way I'm trying to use the reduction?

I think each thread should count some part of array, and then merge it somehow.

#pragma omp parallel for reduction (+: reasult[:i])
    for (i = 0; i < M; i++) {   
      for(j = 0; j < N; j++) {
         if ( numbers[j] == i){
            result[i]++;
         }
      }
  }

Where N is big number telling how many numbers I have. Numbers is array of all numbers and result array with sum of each number.


回答1:


First you have a typo on the name

#pragma omp parallel for reduction (+: reasult[:i])

should actually be "result" not "reasult"

Nonetheless, why are you section the array with result[:i]? Based on your code, it seems that you wanted to reduce the entire array, namely:

#pragma omp parallel for reduction (+: result)
    for (i = 0; i < M; i++)   
      for(j = 0; j < N; j++)
         if ( numbers[j] == i)
            result[i]++;

When one's compiler does not support the OpenMP 4.5 array reduction feature one can alternatively explicitly implement the reduction (check this SO thread to see how).

As pointed out by @Hristo Iliev in the comments:

Provided that M * sizeof(result[0]) / #threads is a multiple of the cache line size, and even if it isn't when the value of M is large enough, there is absolutely no need to involve reduction in the process. Unless the program is running on a NUMA system, that is.

Assuming that the aforementioned conditions are met, and if you analyze carefully the outermost loop iterations (i.e., variable i) are assigned to the threads, and since the variable i is used to access the result array, each thread will be updating a different position of the result array. Therefore, you can simplified your code to:

#pragma omp parallel for
for (i = 0; i < M; i++)   
   for(j = 0; j < N; j++)
      if ( numbers[j] == i)
         result[i]++;


来源:https://stackoverflow.com/questions/65871611/openmp-in-c-array-reduction-parallelize-the-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!