2013-06-25 11 views
0

Вот короткий код, который я получаю от «Введение в параллельные вычисления» в 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?

+2

индекс - это только индекс потока данного блока, не более того. Он должен добавить 1.0f, так как иначе 0-й поток каждого блока будет делить на 0 – alrikai

ответ

2

Этот код вычисляет префиксные суммы. Сумма префикса для массива значений выглядит следующим образом:

array:  1  2  4  3  5  7 
prefix-sums: 1  3  7 10 15 22 
averages: 1  2 2.33 2.25  3 3.67 
index:  0  1  2  3  4  5 

Каждая сумма префикс является суммой элементов в значении array до этой позиции. Код также вычисляет «среднее», которое представляет собой сумму префикса, деленную на количество элементов, используемых для вычисления суммы.

В коде, который вы указали, каждый поток вычисляет другой элемент массива префикс-sum (и отдельное среднее значение).

Поэтому, чтобы вычислить заданное среднее в каждом потоке, мы принимаем префикс-сумму и делим на индекс, но мы должны добавить 1 к индексу, так как добавление 1 к индексу дает нам количество элементов, используемых для вычислить префикс-сумму (и средний) для этого потока.