【发布时间】:2017-01-25 20:29:09
【问题描述】:
我正在 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();
但这似乎对我不起作用。我只是得到最后一个计算值,没有发生线程同步。
【问题讨论】: