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

A simple for-loop with openMP in C

我在下面的代码中有一个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;
    }
  }
}

我认为如果我将关键部分放在条件内部而不是外部,那可能会造成数据危害。有一种聪明的方法来实现它吗?有什么建议吗?

我编写了一个小型并行搜索函数。我只测试过它可以编译,但我相信原理是正确的:

#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;
}