В настоящее время я работаю с программированием CUDA, и я пытаюсь изучить слайды из семинара, который я нашел в Интернете, который можно найти here. Проблема, которая возникает у меня на слайде 48
. Здесь можно найти следующий код:Индексирование отрицательного массива на основе 1d трафарета на основе общей памяти Реализация CUDA
__global__ void stencil_1d(int *in, int *out) {
__shared__ int temp[BLOCK_SIZE + 2 * RADIUS];
int gindex = threadIdx.x + blockIdx.x * blockDim.x;
int lindex = threadIdx.x + RADIUS;
// Read input elements into shared memory
temp[lindex] = in[gindex];
if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = in[gindex - RADIUS];
temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE];
}
....
Чтобы добавить немного контекста. У нас есть массив под названием in
, который, как говорят, N
. Затем мы имеем еще один массив out
, который имеет длину N+(2*RADIUS)
, где RADIUS
имеет значение 3
для данного конкретного примера. Идея состоит в том, чтобы скопировать массив in
в массив out
, но поместить массив in
в положение 3
с начала массива out
i.e out = [RADIUS][in][RADIUS]
, см. Слайд для графического представления.
Путаница происходит в на следующей строке:
temp[lindex - RADIUS] = in[gindex - RADIUS];
Если gindex является 0
то мы имеем in[-3]
. Как мы можем читать из отрицательного индекса в массиве? Любая помощь будет действительно оценена.