我目前正在 AMD Radeon HD 7870 上使用 OpenCL 进行一些基准测试。
我在 JOCL(OpenCL 的 Java 绑定)中编写的代码只是添加了两个二维数组(z=x+y),但它做了很多次(z=x+y+y+y+y+y+y. ..)。
我添加的两个数组的大小是 500 x 501,我正在循环遍历我想在 GPU 上将它们添加在一起的迭代次数。所以我首先添加它们一次,然后添加十次,然后添加一千次,等等。
我循环到的最大迭代次数是 100,000,000。下面是我运行代码时日志文件的样子(计数器是我的程序在 5 秒内执行的次数):
Number of Iterations: 1
Counter: 87
FLOPS Rate: 0.0043310947 GFLOPs/s
Number of Iterations: 10
Counter: 88
FLOPS Rate: 0.043691948 GFLOPs/s
Number of Iterations: 100
Counter: 84
FLOPS Rate: 0.41841218 GFLOPs/s
Number of Iterations: 1000
Counter: 71
FLOPS Rate: 3.5104263 GFLOPs/s
Number of Iterations: 10000
Counter: 8
FLOPS Rate: 3.8689642 GFLOPs/s
Number of Iterations: 100000
Counter: 62
FLOPS Rate: 309.70895 GFLOPs/s
Number of Iterations: 1000000
Counter: 17
FLOPS Rate: 832.0814 GFLOPs/s
Number of Iterations: 10000000
Counter: 2
FLOPS Rate: 974.4635 GFLOPs/s
Number of Iterations: 100000000
Counter: 1
FLOPS Rate: 893.7945 GFLOPs/s
这些数字有意义吗?我觉得 0.97 TeraFLOPS 相当高,我一定是错误地计算了 FLOP 的数量。
此外,我相信我正在计算的 FLOP 数量应该随着迭代次数的增加而趋于平稳,但这在这里并不那么明显。似乎如果我继续增加迭代次数,计算出的 FLOPS 也会增加,这也让我相信我做错了什么。
仅供参考,我按以下方式计算 FLOPS:
FLOPS = 计数器(500)(501)(迭代)/(time_elapsed)
对此问题的任何帮助将不胜感激。
谢谢
编辑:
我现在已经完成了相同的基准测试,循环了一系列迭代(我将 y 添加到 x 的次数)以及数组大小。我已经生成了以下曲面图,可以在这个 GitHub 存储库中看到
https://github.com/ke0m/Senior_Design/blob/master/JOCL/Graphing/GoodGPUPlot.PNG
我已经询问了其他人对这个情节的看法,他们向我提到,虽然我计算的数字是可行的,但它们是人为的高。他们说这在情节的陡坡中很明显,这并没有任何物理意义。关于为什么斜率如此陡峭的一个建议想法是因为编译器将控制迭代(int 类型)的变量转换为 short,因此强制该数字保持在 32000(大约)以下。这意味着我在 GPU 上做的工作比我认为的要少,并且计算出更高的 GFLOPS 值。
任何人都可以确认这个想法或提供任何其他想法来解释为什么情节看起来如此吗?
再次感谢你