我在以下代码中有一个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楼 票数: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;
}

  ask by gvgramazio translate from so

未解决问题?本站智能推荐:

1回复

如何在OpenMP中使用孤立的for循环?

解决:请参见下面的编辑2 我正在尝试并行化对矩阵进行某些运算的算法(为简单起见,我们称其为模糊)。 完成此操作后,它将在旧矩阵与新矩阵之间找到最大的变化(以每个元素为基础,新旧矩阵之间的绝对差的最大值)。 如果此最大差异高于某个阈值,则进行矩阵运算的另一次迭代。 所以我的主程序有以下
1回复

使用OpenMP任务进行带中断的并行for循环

我是 OpenMP 的初学者,正在学习有关任务的知识,并希望将它们应用到以下场景中。 这个例子本身完全没用; 重点是并行化包含中断条件并执行 IO 操作的循环。 为了这个问题,我保留了通用的中断条件。 我尝试了以下方法,但程序变得非常慢(可能是因为我创建了太多任务......)。 我也尝试使用 ta
1回复

使用C和OpenMP进行并行编程

我正在尝试将其转换为 openMP,但我无法正确转换它,任何帮助将不胜感激。 我现在可以将简单循环转换为 openMp,但不能使用函数。 所以试图了解它是如何工作的。 谢谢!
1回复

在C中使用openmp时的数值差异

这个问题已经在这里有了答案: 浮点数学运算是否损坏? (30个答案) 4天前关闭。 我正在执行一个求解整数微分方程的代码,并且该方程具有一
1回复

使用openMP进行循环并行化的数组操作

我正在尝试并行化基于数组操作的循环。 但是,我无法获得预期的加速。 我猜我的实现中并行化的方式是错误的。 这是一个例子: 这是另一个: 我的方式有什么问题吗? 我该如何改进?
3回复

使用OpenMP(C)的矩阵乘法-折叠所有循环

所以我正在学习 C 语言中的 OpenMP 基础知识和工作共享结构,尤其是 for 循环。 所有教程中使用的最著名的例子之一是矩阵乘法,但它们都只是并行化外循环或两个外循环。 我想知道为什么我们不像我在这里所做的那样并行化和折叠所有 3 个循环(使用原子): 你能告诉我我在这里遗漏了什么,或者为什么
1回复

c中使用openmp的并行程序无法正常工作

当我在代码块中运行这段代码时,它给出了一个奇怪的输出 那么,为什么输出没有组织?
1回复

在C中使用openMP并行化功能

我编写了一个程序,该程序输入矩阵大小和线程数,然后生成一个0和1的随机二进制矩阵。 然后,我需要找到1的簇,并给每个簇一个唯一的数字。 我正确地获取了输出,但是在并行化函数时遇到了问题。 我的教授要求我将矩阵行分成“ thread_cnt”部分。 即:线程大小为4,矩阵大小为8,然后