2016-06-27 2 views
0

Я пишу код cuda c для обработки изображений, например, я создал функцию свопинга (swap blocks of the matrix), но он не работает каждый раз, когда у меня проблема с количеством блоков и количество потоков, когда я обедаю свое ядро.Конфигурация ядра Cuda

Например, если я Tak изображение размером 2048 * 2048 с

threadsPerBlock.x=threadsPerBlock.y=64 и numBlocks.x=numBlocks.y=2048/threadsPerBlock.x

затем swap<<<threadsPerBlock,numBlocks>>>(...) работает отлично.

Но если я беру изображение размером 2560 * 2160, threadsPerBlock.x=threadsPerBlock.y=64 и numBlocks.x=2560/64 и numBlocks.y=2160/64+1, у меня есть ошибка. 9 - неверный аргумент конфигурации.

Я использую CUDA 7.5 и GPU с вычислительной способностью 5,0

ответ

2

maximum number of threads per block for your compute 5.0 устройство 1024. источником проблем является то, что у вас есть аргументы в запуске ядра восстанавливается. Когда максимальный размер изображения меньше 2048, это дает вам запуск с менее чем 1024 потоками на каждый блок. Больше, чем 2048, и размер блока становится незаконным

Если вы что-то вроде этого:

threadsPerBlock.x=threadsPerBlock.y=32 
numBlocks.x=numBlocks.y=2048/threadsPerBlock.x 
swap<<<numBlocks,threadsPerBlock>>>(...) 

Вы должны найти запуск ядра работает без всяких условий.

+0

Да, у меня есть вычисление 5.0, но у меня есть размер измерения размера блока потока (x, y, z): (1024, 1024, 64) Я использую 2Dim проблему, которую я забыл munchen, она работает для размера 2560 * 2160 с размером 256 * 256 размером с первой i, которая может быть передана числом блоков, но это не так. –

+0

@SalahEddine: Вы недооцениваете ограничения размера блока. (Re) прочитал ссылку в моем ответе. Максимальные размеры блока (1024,1024,64), но * общее число * потоков на блок должно быть меньше или равно 1024, т.е. только блоки с 'dim.x * dim.y * dim.z <= 1024' являются законными – talonmies

+0

Thnx много когтей, что было моей проблемой :) –