任务大小不变 - 在 1x 和 2x CPU 上执行时间相同 - OpenCl

Constant size of task - the same executing time on 1x and 2x CPU - OpenCl

我在理解积分算法(在 OpenCl 中实现)方面的结果时遇到问题。 我可以访问两个 Intel Xeon E5-2680 v3 ,一个有 12 个内核。

从 OpenCl 我不知道为什么,但我只能看到一个设备,但我可以请求 12 或 24 个内核,所以我想 "see" 一个或两个设备并不重要,如果 24使用了内核(2 CPUs)。

我正在 运行 处理最大局部大小 = 4096 和最小全局大小 = 4096 的任务,并且对于 1 CPU 和 2 CPU 执行时间是相同的,我正在将全局大小更改为 2* 4096、4* 4096、8* 4096,当我达到 16* 4096 全局大小时,1CPU 正在减速,但 2x CPU 正在加速,并且每个下一个全局大小我更改为比以前更大,2x CPU 比 1x CPU.

快 2 倍

我不明白为什么从一开始我们就看不到 2x CPU 优于 1x CPU 的优势。 对我来说也很重要的是,我正在收集 CPU 的功耗,在最后一个全局大小 = 8* 4096 中,当我们看到相同的执行时间 1 和 2 CPU 时,我可以看到 2 CPUs 的功耗有点小,当全局大小增加时,2 CPU 的功耗低于 1 CPU 我猜是因为执行时间快了 2 倍,但是它不应该等于或大于 1 CPU 吗? 可能重要的是:我检查过 1 和 2 CPU 总是有 2.5 Ghz 频率,而且它没有改变。 我对以上的问题是:

  1. 为什么在较小的全局大小上 1 CPU 和 2 CPU 具有相同的执行时间?

  2. 为什么全局尺寸越大的 2 CPU 功耗更小。

  3. 为什么在全局大小 = 8*4096 且执行时间相同的情况下,2 CPUs 的功耗略低于 1 CPU .

我需要补充一点,每个 运行 都是 10 倍,所以这些结果不是偶然的

这是我的结果:

Why on smaller global Size's 1 CPU and 2 CPU have equal execution time?

因为您使用 4096 作为本地大小。 cpu 的每个计算单元是 1 个核心。您将 16x4096 作为全局大小,因此它使用了 16 个内核。可能您使用了内存绑定内核或一个内核访问其他 CPU 的缓存或内存,因此它使用 1 个内核还是 N 个内核都无关紧要。当您增加全局大小时,其他 CPU 内存可以更频繁地使用,并且内存访问模式变得更加对称。

Why on bigger global size's 2 CPU have smaller power consumption.

2 CPU 有更多的缓存,因此他们可以同时调度更多的内核,甚至数据的重用可能比访问 ram 的功耗更低。从内存中获取数据应该比从缓存中获取数据更耗电。

Why in that one point when Global Size = 8*4096 when we have equal execution times, I have slightly less power consumption with 2 CPUs than 1 CPU.

使用 8 个内核(8 * 本地大小),单个 CPU 必须已被使用,即使未被使用,相同的内存组也可能被 CPU 和内存使用带宽成为瓶颈。同样,2 CPU 有更多的缓存,因此必须有一些 data-reuse 才能利用更大的缓存来降低功耗。


您应该尝试不同的设备裂变组合以获得核心的最大局部性和数据共享性。线程可以随机分布在 CPU 个内核和硬件线程之间。 Device Fission 解决了这个问题,并提供了对线程调度的更多控制。