繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM