Понимание индексации и количества потоков в блоке - PullRequest
3 голосов
/ 07 июня 2019

Я изучаю программирование cuda и обнаружил, что существует несколько способов индексации сетки.

Что я не понимаю, так это то, как эти методы индексации отличаются друг от друга.

Это мои индексы:

1D сетка из 1D блоков

th=blockIdx.x *blockDim.x + threadIdx.x;

1D сетка 2D блоков

th=blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;

1D сетка 3D блоков

th =blockIdx.x * blockDim.x * blockDim.y * blockDim.z + threadIdx.z * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;

В чем преимущество использования второго типа индексации относительно первого?

У меня также проблема с чтением этой информации: «Максимальное количество нитей на блок составляет 1024, а максимальный размерный размер блока нитей (x, y, z) составляет (1024,1024,64)» что это значит, что blockdim.z равен 64? там только 64 темы или 1024 * 64? Что делать, если я использую все направления? увеличивается число нитей, которые я могу использовать в сетке?

1 Ответ

3 голосов
/ 07 июня 2019

Индексирование отражает, как вы хотите логически разделить ваши данные между вашими потоками. Если вы имеете дело с одномерной задачей (представьте, что вы вычисляете сумму двух векторов), то вы согласны со мной, что гораздо проще использовать одномерное разложение, чтобы вы могли легко сопоставить один поток с парой элементов из двух входных данных. массивы.

Если вы работаете с двумерной и трехмерной структурой, такой как матрица, применяется один и тот же аргумент.

По поводу второго вопроса о максимальном количестве потоков. Вы можете рассчитать количество потоков в блоке с размером (x, y, z) как x*y*z. Максимальное количество разрешенных потоков на блок составляет 1024. Это означает, что вам разрешено использовать все значения, которые вы хотите для x,y,z, при условии, что их продукт не превышает 1024 и что x,y<=1024 и z<=64.

...