【发布时间】:2021-10-03 06:46:57
【问题描述】:
我正在使用 c++ dll 来进行一些计算密集型处理——我的 c++ 使用线程——并在我的 c# 应用程序中使用这个 dll。
我使用 MS Visual Studio Profiler 来识别最耗时的代码部分。
并使用 openMP 通过在运行 @2.9GHz 的 Intel i7 8 核处理器之间分配工作负载来提高性能。
例如下面的代码会消耗大量的cpu时间
for (short j = 0; j < 4096; j++)
histsum[j] = hist_tmp[row][col][0][j] + hist_tmp[row][col][1][j] + hist_tmp[row][col][2][j] + hist_tmp[row][col][3][j];
所以我修改为
#pragma omp parallel for
for (short j = 0; j < 4096; j++)
histsum[j] = hist_tmp[row][col][0][j] + hist_tmp[row][col][1][j] + hist_tmp[row][col][2][j] + hist_tmp[row][col][3][j];
我注意到 8 核是 100% 加载的,但整体性能并没有提高。
可能是什么问题?我该如何克服它?
【问题讨论】:
-
通常你不会通过使用更多线程来减少cpu时间。这是更多的cpu时间。你想测量挂钟时间而不是 CPU 时间
-
@463035818_is_not_a_number 我知道我并没有减少 CPU 时间,我提到 cpu 已 100% 加载表明 openMP 正在并行化我的代码,并且 cpu 的利用率得到了提高,这是预期的,但是什么是奇怪的是,用挂钟衡量的整体性能下降了,没有提高
-
我只是在向您指出一些可能是误解的东西。可能只是措辞。你写“消耗CPU的很多时间......所以我将它修改为......”。无论如何,问题中的信息太少,无法知道为什么没有加速。如果您需要代码方面的帮助,您应该包含minimal reproducible example。有关性能的问题通常需要更多信息,您测量的是什么时间?你是怎么测量的?什么编译器?什么编译器标志?等等……
-
因为工作量很小,开销扼杀了速度的提升。对于现代处理器来说,添加 4 个大小为 4096 的向量是非常小的工作量,不值得并行化..