Вот короткий код, который я получаю от «Введение в параллельные вычисления» в udacity. индекс в этом коде смущает меня.индекс в threadId в Cuda
__global__ void use_shared_memory_GPU(float *array)
{
int i, index = threadIdx.x;
float average, sum=0.0f;
__shared__ float sh_arr[128];
sh_arr[index] = array[index];
__syncthreads();
// Now it begins to confuse me
for(i=0; i<index; i++) { sum += sh_arr[i]; } // what is the index here?
average = sum/(index + 1.0f); // what is the index here?
// why add 1.0f?
if(array[index] > average) {array[index] = average;}
}
индекс создается как Id для каждого потока, который я могу понять. Но при вычислении среднего значения индекс используется как количество потоков. Первый индекс используется как идентификатор параллельного вычисления для массивов, тогда как второй индекс используется как обычный c. Я повторяю эту процедуру в своей программе, но результат не повторяется.
Какой фокус стоит индекс? Я печатаю его в cuda-gdb, он просто показывает 0. Любое подробное объяснение для этого?
Добавить одну точку. Когда вычисляется среднее значение, почему он добавляет 1.0f?
индекс - это только индекс потока данного блока, не более того. Он должен добавить 1.0f, так как иначе 0-й поток каждого блока будет делить на 0 – alrikai