【问题标题】:In OpenMp using more threads slows down my programme. Serial is faster than在 OpenMp 中使用更多线程会减慢我的程序。串行速度比
【发布时间】:2020-12-06 01:00:27
【问题描述】:

我使用的线程越多,我的 OpenMP 程序就越慢。我尝试了 arraypadding (阅读有关虚假共享的信息)作为没有帮助的解决方案。你知道解决方案吗?

StringLength 是 String1 和 String2 的长度。对于长度约为 60k 的字符串,一个线程大约需要 20 秒,而 16 个线程大约需要 50 秒。

整个程序还有另一个类似的循环。所以总共2个循环就是这样。它在具有 2 个 Intel Xeon 八核的集群上运行。它使用 g++ 和 -O2 运行。

#pragma omp parallel shared(p3, p1,p2, string1,string2, maxLen) num_threads(16)  default(none) 
    {
    for (int i = 3; i <= StringLength+ 1; i++) {
        #pragma omp for schedule(static, 5000) 
        for (int j = 1; j < i - 1; j++) {
            p3[j] = min({ p2[j - 1] + 1, p2[j] + 1, p1[j - 1] + (string1[j] == string2[i - j]) });
        }
        #pragma omp single
        {
            p3[i - 1] = i - 1;
            p3[0] = i - 1;
            swap(p1,p2);
            swap(p2,p3);
        }
    }

【问题讨论】:

  • “程序变慢” - 变慢是什么意思?需要多长时间?
  • 你能不能 -O3-O2 一起“实际优化”而不是“有点优化”?
  • 线程数应与内核数成正比。对于 2 个内核,16 个线程将 CPU 埋在任务中。随着线程数超过可用内核数,性能将急剧下降。
  • 当您说“集群”时,您会在这里混淆问题。这是一台机器,还是一组机器?
  • 不管怎样,如果这只是简单的数学运算,这就是 GPU 内核函数擅长的。我也会寻找更好的算法。这甚至有什么作用?

标签: c++ multithreading for-loop openmp


【解决方案1】:

解决方案是在一个 for 循环中编写代码。而且我也不再使用动态内存了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2019-04-23
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多