2013-05-19 4 views
2

Я работаю над чем-то, что подчеркнуло тот факт, что я не знаю, как блоки и сетки работают в cuda. У меня есть матрица 1000x10, которую я хотел бы пересечь и заполнить каждый элемент значением. Ядро, как это:Cuda/PyCuda - Большой обход матрицы и размер блока/сетки

__global__ void myfun(float *vals,float *out, int M, int N) 
    { 
     int row = blockIdx.y*blockDim.y + threadIdx.y; 
     int col = blockIdx.x*blockDim.x + threadIdx.x; 
     int index = row*N + col; 

     if((row < M) && (col < N)) { 
      out[index] = index; 
     } 
} 

, где М = 1000 и N = 10. Я не знаю, как разрезать это так, что я могу покрыть каждый элемент в матрице. Поскольку мне нужно покрытие для 1000 * 10 = 10000 элементов и учитывая ограничения на количество потоков, я не могу использовать размеры блоков (10,1000,1). Используя pycuda, я пробовал такие вещи, как block = (10,100,1), grid = (1,10), но я никогда не получал полного охвата матричных элементов. Каков правильный способ сделать это?

ответ

2

Исправьте размер блока и сохраните динамический размер сетки. Таким образом, ядро ​​будет охватывать каждый элемент матрицы независимо от того, каковы значения M и N.

block = (8,8) 
grid = ((N + 7)/8, (M + 7)/8) 

Запустить ядро ​​с этой конфигурацией сетки и блока. Сохраняясь в пределах устройства, вы можете при необходимости изменить размер блока.

+0

Это здорово, спасибо! – user1489497

+0

Я знаю, что элементы 'block (X, Y)' должны быть круглыми кратными магическому числу 32. Но что означают эти '7' и' 8'? Может быть, эта функция является «сеткой = ((N + (X-1)/X, (M + (Y-1)/Y)», и если да, то почему/в чем смысл? – user3085931

+1

@ user3085931 ... Да, точно, это общая формула для любого размера блока. Я предоставил расчеты, специфичные для размера блока '8 x 8'. – sgarizvi

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