在 OpenMp 中使用更多线程会减慢我的程序。串行速度比

Posted

技术标签:

【中文标题】在 OpenMp 中使用更多线程会减慢我的程序。串行速度比【英文标题】:In OpenMp using more threads slows down my programme. Serial is faster than 【发布时间】: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 内核函数擅长的。我也会寻找更好的算法。这甚至有什么作用? 【参考方案1】:

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

【讨论】:

以上是关于在 OpenMp 中使用更多线程会减慢我的程序。串行速度比的主要内容,如果未能解决你的问题,请参考以下文章

极智Coding | OpenMP 多线程使用

在 OpenMP 中并行化嵌套循环并使用更多线程执行内部循环

在 OpenMP 中重置线程局部变量

如何修复 OpenMP 程序的 gdb 运行中的线程数

Openmp 程序在没有临界区的情况下工作

不同主机上的 OpenMP 程序