2017-01-23 29 views
0

我在使用兩個不同線程的CUDA中編寫內核。這裏是情景如何。我有3個參數數組(alpha,beta,sigma),每個數組的大小爲64. 而且我有一個大小爲10000的randomValue數組。具有兩個不同線索索引的cuda內核

我的目標是創建一個大小爲64的數組,函數(NextRate)和相應參數的所有不同randomValues。我可以如代碼所示通過將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個值。