【发布时间】: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