【问题标题】:Sorting an array in openmp在openmp中对数组进行排序
【发布时间】:2011-05-05 22:50:00
【问题描述】:

我有一个包含 100 个元素的数组,需要使用 OpenMP 进行插入排序。当我并行化我的排序时,它没有给出正确的值。谁能帮帮我

void insertionSort(int a[])
{
    int i, j, k;
    #pragma omp parallel for private(i)
    for(i = 0; i < 100; i++)
    {
            k = a[i];
            for (j = i; j > 0 && a[j-1] > k; j--)
                    #pragma omp critical
                    a[j] = a[j-1];
                    a[j] = k;
    }
}

【问题讨论】:

标签: openmp insertion-sort


【解决方案1】:

变量“j”和“k”需要在并行区域上是私有的。否则,您会遇到数据争用情况。

【讨论】:

  • @ejd 当我将“j”和“k”设为私有时,我得到以下输出
  • (2), (2), (3), (4), (4), (4), (5), (5), (6), (7), (8) ), (9), (10), (10), (11), (15), (29), (34), (45), (54), (63), (66), (77), (99), (1100), (1254), (1300), (4322), (5), (5), (6), (6), (7), (7), (8), (8) ), (9), (19), (22), (24), (27), (32), (33), (34), (34), (39), (42), (43), (44), (45), (45), (48), (54), (54), (54), (54), (54), (55), (58), (64), (65) ), (66), (76), (79), (89), (92), (95), (98), (100), (344), (667), (2999), (5454), (5454), (9377), (8), (6), (6), (23), (25), (25), (32), (33), (43), (43), (43) ), (45), (45), (52), (54), (63), (64), (75), (435), (665), (776), (954), (2323), (9444),
  • 我只是在评论数据范围。您需要查看关键区域。
  • @ejd 我让它变得很关键,以便在操作值时只有一个线程可以进入。我能做些什么不同的事情。
  • 你没有保护整个价值交换。
【解决方案2】:

除非是家庭作业,否则并行排序少至 100 个元素是没有意义的:并行引入的开销将远远超过任何性能优势。

而且,插入排序算法本质上是串行的。当处理 a[i] 时,假设数组中所有先前的元素都已排序。但是如果两个元素并行处理,显然就没有这样的保证了。

更详细的解释为什么插入排序不能以建议的方式并行化is given by @dreamcrash in his answer to a similar question

【讨论】:

  • 是的,这是家庭作业,最后一刻才决定在 openmp 中执行此操作。我确实意识到对于一个数组,这种大小的插入按顺序工作得很快。我得到的时间是 0.00016 秒,而在 openmp 中是 0.00216。
  • +1,糟糕的是没有选择正确的答案。不久前我回答了一个类似的问题,其中 OP 使用相同的算法和相同的并行化,也许 OP 从这里获取,认为它是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2011-04-23
  • 2016-06-28
  • 2012-02-14
  • 2017-04-08
  • 2013-12-24
  • 2013-08-05
相关资源
最近更新 更多