Я работаю над кодом OpenCL, который вычисляет сумму элементов массива. Каждый работает нормально до размера 1,024 * 1e+8 для входного массива 1D, но с 1,024 * 1e+9 окончательное значение равно «-Nan».
Вот исходный код по этой ссылке
Код ядра находится по этой ссылке.
и 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 ГБ: не слишком ли это много? У меня всего 8 ГБ оперативной памяти.
Из вашего опыта, откуда может появиться эта проблема?
Спасибо
malloc
илиclCreateBuffer
из-за нехватки памяти. Также проверьте, является лиsize_t
32-битным или 64-битным целым числом на вашей платформе. - person Martin Zabel   schedule 20.02.2016