在C中使用openMP的简单for循环

时间:2015-03-31 11:44:47

标签: c parallel-processing openmp

我在以下代码中有一个for循环。

int min = -1;
int pos;
int array[100];

for(i = 0; i < 100; i++){
  if(array[i] < min || min == -1){
    min = array[i];
    pos = i;
  }
}

我认为以下代码是使用openMP的正确实现,但它太慢了。

int min = -1;
int pos;
int array[100];

#pragma omp parallel for default(none) shared(array, min) 
for(i = 0; i < 100; i++){
#pragma omp critical
  {
    if(array[i] < min || min == -1){
      min = array[i];
      pos = i;
    }
  }
}

如果我把关键部分放在条件而不是外部,我认为这可能是数据危害。有一种聪明的方法来实现它吗?一些建议?

1 个答案:

答案 0 :(得分:2)

我编写了一个小型并行搜索功能。我只是测试它编译,但我相信原则是合理的:

#include <stddef.h>
#define MINDIVIDE 1024

int parallelminsearch(int const *array, size_t size)
{
  int minimum;
  if (size < MINDIVIDE)
    {
      minimum = array[0];
      for (size_t i = 1; i < size; i++)
        {
          if (array[i] < minimum)
          minimum = array[i];
        }
      return minimum;
    }
  int pmin[2];
  #pragma omp parallel for
  for (size_t i = 0; i < 2; i++)
    {
      pmin[i] = parallelminsearch(&array[i*size/2], (size+1)/2);
    }
  minimum = (pmin[0] < pmin[1])?pmin[0]:pmin[1];
  return minimum;
}