2017-01-23 13 views
0

Я пишу ядро ​​в CUDA, которое использует два разных потока. вот как идет сценарий. У меня есть 3 массива параметров (альфа, бета, сигма), каждый из которых имеет размер 64. И у меня есть массив randomValue размером 10000.ядро ​​cuda с двумя разными индексами потоков

Моя цель - создать массив размером 64, который вычисляет function (NextRate) со всеми различными случайными значениями для соответствующих параметров. что я могу сделать, как показано в коде, определяя tid2 как индекс для параметров и tid3 как индекс для randomValues. вот мое ядро:

__global__ void evaluateVasicek(KernelArray<double> crrntMonthMdlData, KernelArray<double> crrntMonthMrktData, 
          KernelArray<double> alpha, KernelArray<double> beta, 
          KernelArray<double> sigma, KernelArray<double> nextRateRands, 
          const int NP, double r0, KernelArray<double> dr) 
{ 
    int tid = blockIdx.x * blockDim.x + threadIdx.x; 

    if (tid >= 640000) 
    return; 

    int tid2 = tid/10000; // The index for Parameters 
    int tid3 = tid % 10000; // The index for randomArray 

    dr._array[tid2] += NextRate(nextRateRands._array[tid3], alpha._array[tid2], beta._array[tid2], sigma._array[tid2], r0); 
    __syncthreads(); 

    if (tid3 == 0) 
     printf("dr for tid %d is %f\n", tid2, dr._array[tid2]); 

} 

Когда я хочу подвести итог всего 10000 др для соответствующих параметров я пишу следующую строку:

dr._array[tid2] += NextRate(nextRateRands._array[tid3], alpha._array[tid2], beta._array[tid2], sigma._array[tid2], r0); 
__syncthreads(); 

Но это, кажется, не работает для меня. Я просто получаю последнее вычисленное значение и не происходит нити.

ответ

0

Поскольку я нашел ответ, я подумал, что хорошо сообщить другим людям.

__global__ void evaluateVasicek(KernelArray<double> crrntMonthMdlData, KernelArray<double> crrntMonthMrktData, 
          KernelArray<double> alpha, KernelArray<double> beta, 
          KernelArray<double> sigma, KernelArray<double> nextRateRands, 
          const int NP, double r0, KernelArray<double> dr, KernelArray<double> dr64, 
          KernelArray<double> rNext, KernelArray<double> tau, KernelArray<double> error) 
{ 
    int tid = blockIdx.x * blockDim.x + threadIdx.x; 

    if (tid >= 640000) 
    return; 

    int tid2 = tid/10000; // The index for Parameters 
    int tid3 = tid % 10000; // The index for randomArray 

    dr._array[tid] += NextRate(nextRateRands._array[tid3], alpha._array[tid2], beta._array[tid2], sigma._array[tid2], r0); 
    __syncthreads(); 

    if (tid3 == 0) { 

    for (int i = 0; i < 10000; ++i) 
    dr64._array[tid2] += dr._array[tid2 * 10000 + i]; 


    rNext._array[tid2] = r0 + dr64._array[tid2]/10000; 

Так в основном то, что я должен был сделать ÐŘ массив размером 640000 и каждый поток вычисляет один вызов функции.

Затем я сделал еще один массив с именем dr64 размером 64 и для каждого из индексов параметров (tid2) подытожим все соответствующие 10000 значений.