Понимание сетки и блока в cp.RawKernel - PullRequest
1 голос
/ 27 июня 2019

Пример, показанный в https://buildmedia.readthedocs.org/media/pdf/cupy/latest/cupy.pdf на странице 11 относительно использования cp.RawKernel, мне не понятен с точки зрения использования grid, block, потому что матрицы квадратные.

Я пыталсяизмените форму матриц и попробуйте поиграть с сеткой и блоком.Мне не ясно, почему для получения правильных результатов я должен установить сетку 8 и блок 8 как умножение ((8,), (8,), (p, q, z)) # grid, блок и аргументы

import cupy as cp #Importing CuPy

#Defining the CUDA kernel
multiply = cp.RawKernel(r'''
extern "C" __global__
void multiply(const int* p, const int* q, int* z) {
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    z[tid] = p[tid] + q[tid];
 }
''', 'multiply')

#First two arrays are set as 0,1,2,3....upto 300
p = cp.arange(30, dtype=cp.int).reshape(6,5)
q = cp.arange(30, dtype=cp.int).reshape(6,5)

#Setting a new array with zeros to pass to kernel for computation
z = cp.zeros((6,5), dtype=cp.int)
#Invoking the kernel with a grid of 250 blocks, each consisting of 1024 threads
multiply((6, ), (5, ), (p, q, z))  # grid, block and arguments

#Displaying the output computed on the kernel
print(z)

Я ожидал получить правильные настройки результатов, как в приведенном выше коде, умножить ((6,), (5,), (p, q, z)) # grid, block и arguments

Canпожалуйста, помогите мне?

1 Ответ

1 голос
/ 29 июня 2019

Вы также изменили типы данных из примера, на который ссылались, и сделали это неправильно.

Если указать правильный тип данных cupy (cp.int32), соответствующий выбранному вами типу данных исходного ядра, который вы выбрали(int), тогда ваш код работает правильно для меня, как:

$ cat t7.py
import cupy as cp #Importing CuPy

#Defining the CUDA kernel
multiply = cp.RawKernel(r'''
extern "C" __global__
void multiply(const int* p, const int* q, int* z) {
    int tid = blockDim.x * blockIdx.x + threadIdx.x;
    z[tid] = p[tid] + q[tid];
 }
''', 'multiply')

#First two arrays are set as 0,1,2,3....upto 300
p = cp.arange(30, dtype=cp.int32).reshape(6,5)
q = cp.arange(30, dtype=cp.int32).reshape(6,5)

#Setting a new array with zeros to pass to kernel for computation
z = cp.zeros((6,5), dtype=cp.int32)
#Invoking the kernel with a grid of 250 blocks, each consisting of 1024 threads
multiply((6, ), (5, ), (p, q, z))  # grid, block and arguments

#Displaying the output computed on the kernel
print(z)
$ python t7.py
[[ 0  2  4  6  8]
 [10 12 14 16 18]
 [20 22 24 26 28]
 [30 32 34 36 38]
 [40 42 44 46 48]
 [50 52 54 56 58]]
$
...