具有两个不同线程索引的cuda内核

时间:2017-01-23 17:10:53

标签: c++ cuda

我在CUDA中编写一个使用两个不同线程的内核。这是场景的方式。我有3个参数数组(alpha,beta,sigma),每个数组的大小为64。 我有一个大小为10000的randomValue数组。

我的目标是创建一个大小为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(); 

但这似乎不适合我。我刚刚得到最后一个计算值,并且没有发生线程同步。

1 个答案:

答案 0 :(得分: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;

所以基本上我所做的就是让dr成为一个大小为640000的数组,每个线程计算一个函数调用。

然后,我创建了另一个名为dr64的数组,大小为64,并且对于每个参数索引(tid2),我总结了所有相应的10000个值。