Я довольно новичок в программировании 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; однако, это, кажется, не дает большой дискуссии по этому вопросу.