【发布时间】:2016-02-21 18:44:30
【问题描述】:
我正在编写一个计算数组元素总和的 OpenCL 代码。对于 1D 输入数组,每一个都可以正常工作,最大为 1.024 * 1e+8,但对于 1.024 * 1e+9,最终值为“-Nan”。
这是this link上的代码源
内核代码在this link
还有this link上的Makefile
这是最后一个有效的数组大小的结果(最后一个有效的大小值是 1.024 * 1e+8):
$ ./sumReductionGPU 102400000
Max WorkGroup size = 4100
Number of WorkGroups = 800000
Problem size = 102400000
Final Sum Sequential = 5.2428800512000000000e+15
Final Sum GPU = 5.2428800512000000000e+15
Initializing Arrays : Wall Clock = 0 second 673785 micro
Preparing GPU/OpenCL : Wall Clock = 1 second 925451 micro
Time for one NDRangeKernel call and WorkGroups final Sum : Wall Clock = 0 second 30511 micro
Time for Sequential Sum computing : Wall Clock = 0 second 398485 micro
我有local_item_size = 128,所以如上所示,我有800000 Work-Groups 为NWorkItems = 1.024 * 1e+8。
现在,如果我取 1.024 * 10^9,则不再计算部分总和,我得到数组元素总和的“-nan”值。
$ ./sumReductionGPU 1024000000
Max WorkGroup size = 4100
Number of WorkGroups = 8000000
Problem size = 1024000000
Final Sum Sequential = 5.2428800006710899200e+17
Final Sum GPU = -nan
Initializing Arrays : Wall Clock = 24 second 360088 micro
Preparing GPU/OpenCL : Wall Clock = 19 second 494640 micro
Time for one NDRangeKernel call and WorkGroups final Sum : Wall Clock = 0 second 481910 micro
Time for Sequential Sum computing : Wall Clock = 166 second 214384 micro
也许我已经达到了 GPU 单元可以计算的极限。但我想征求您的意见以确认这一点。
如果 double 是 8 bytes,则输入数组需要 1.024 * 1e9 * 8 ~ 8 GB:是不是太多了?我只有 8 GB 的 RAM。
根据您的经验,这个问题可能来自哪里?
谢谢
【问题讨论】:
-
请检查
malloc或clCreateBuffer调用之一是否由于内存不足而失败。还要检查size_t在您的平台上是 32 位还是 64 位整数。 -
谢谢,问题来自 clCreateBuffer,它对 1.024*1e9 工作项失败