我在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();
但这似乎不适合我。我刚刚得到最后一个计算值,并且没有发生线程同步。
答案 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个值。