在 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 中使用更多线程会减慢我的程序。串行速度比的主要内容,如果未能解决你的问题,请参考以下文章