2014-01-13 2 views
3

У меня есть вопрос о моем коде и могу ли я запустить его на моем текущем устройстве или нет. В принципе, я хочу сделать трехмерную интерполяцию. Когда я запускаю мою интерполяцию ядро, я получаю следующее сообщение об ошибке: сбоя ядра: недействительной конфигурации аргументеОшибка ядра: неверный аргумент конфигурации

Я видел in this discussion, что это может произойти, если вы звоните слишком много потоков или блоков, но я не уверен, что это в моем коде. Может ли кто-нибудь взглянуть на него и сказать мне, что случилось?

Вот как я называю мое ядро:

dim3 blockSize(6,6,6);

dim3 threadSize(dimX/blockSize.x,dimY/blockSize.y,dimZ/blockSize.z);

d_interpolate_kernel<<<blockSize,threadSize>>>(output,dimX,dimY,dimZ);

Моих размерами являются ИтМ = 54 или 108, = ИтХ Димы = 42 или 84. Так У меня есть blockSize (6,6,6) и threadSize (9,7,7) или (18,14,14).

Моя карта имеет следующие возможности:

MAX_BLOCK_DIM_X = 512 
MAX_BLOCK_DIM_Y = 512 
MAX_BLOCK_DIM_Z = 64 

MAX_GRID_DIM_X = 65535 
MAX_GRID_DIM_Y = 65535 
MAX_GRID_DIM_Z = 1 

Могу ли я получить ошибку, потому что MAX_GRID_DIM_Z является 1? Если да, есть ли способ обойти это?

Спасибо!

ответ

3

Одна проблема заключается в том, что у вас есть свои blockSize и threadSize переменные, перевернутые в вашем ядре.

Вы хотите что-то вроде этого:

d_interpolate_kernel<<<threadSize,blockSize>>>(output,dimX,dimY,dimZ); 

Первая конфигурация аргумент является размер сетки в блоках.

Второй аргумент конфигурации: размер блока в потоках.

Поскольку вы их отменили, ваши значения (18,14,14) не являются допустимыми размерами блоков (слишком много потоков), так как максимальное количество потоков на один блок равно 512 (для cc1.x) или 1024 (в противном случае), тогда как 18x14x14 = 3528.

Для меня threadSize - запутанное имя. Я бы назвал его gridSize или что-то в этом роде.

Вторая проблема, о которой вы указали, заключается в том, что для карты cc1.x (которая, кажется, является тем, что у вас есть) размер вашей сетки Z должен быть равен 1. По крайней мере, для вашего случая 42 вы можете исправить это реструктурируя блоки потока, чтобы иметь размер, скажем, (2,2,42), а ваша сетка - размерность, скажем, (27, 21, 1).

В противном случае эти индексы являются просто произвольными схемами нумерации. Вы можете придумать 2D-сетку, которая покрывает весь ваш объем 3D, используя размер блока (6, 6, 6), если это то, что вы хотите. Вам просто нужно получить представление о том, как вы сопоставляете blockIdx.x и blockIdx.y встроенные переменные в ядре интерполяции, чтобы имитировать 3D-сетку.

+0

Спасибо, Роберт помог мне изменить blockSize и threadSize. Я также пробовал с более новой карточкой, и это сработало. Я был смущен о сетках и блоках, но теперь это яснее. Спасибо! – azhew

Смежные вопросы