Индексация в ядре CUDA - PullRequest
       8

Индексация в ядре CUDA

0 голосов
/ 28 апреля 2020

Я довольно новичок в программировании CUDA, и мне трудно понять, что именно происходит с ядром. У меня есть ядро ​​CUDA, которое содержит несколько __device__ функций. Индекс определяется в теле функции ядра, то есть

__global__ void kernel() {
    int j1 = blockIdx.x * blockDim.x + threadIdx.x;
    function1(j1);
    function2(j1);
    ...
}

Каждая функция __device__ принимает j1, который является индексом. Я хочу использовать этот индекс для массива, который доступен в функциях:

void function1(j1){
   int foo = bar;
   array[j1] = foo;  **breakpoint here**
   //array is initialized to {0, 0, 0, 0, 0}
}

При отладке я устанавливаю точку останова так, что программа останавливается после выполнения строки array (указанной в коде блок). Здесь j1 = 0. Таким образом, можно представить, что array = {foo, 0, 0, 0, 0} Однако это не так. Я заканчиваю с: array = {foo, foo, foo, foo, foo}. Я не могу понять почему.

Я чувствую, что способ, которым я представляю выполнение ядра CUDA, неверен. Я представляю, как ядро ​​передает функции __device__ одному потоку, получает индекс и номер блока этого потока, а затем поток выполняет каждую из функций по порядку (я понимаю, что эта модель сильно упрощена, но я чувствую, что она приемлема на высоком уровне). Мой вопрос заключается в том, как правильно думать о том, как ядро ​​будет выполнять эти функции и индексировать потоки / блоки. Кроме того, как правильно передать мой индекс j1 этим функциям? Я посмотрел на документацию CUDA; однако, это, кажется, не дает большой дискуссии по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...