我写了一个CUDA程序,我有两个关于这个程序的问题。
kernel <<< (1,1), (length, length) >>>
根据长度的规律性变化。当长度> 32时,内核花费的时间突然减少100-1000次。我首先怀疑我的计时代码是错误的,但经过检查后,我认为没有错误。之后,我会附上时间码。导致这样的结果的原因是什么?
dim3 dimBlock(length, length);
dim3 dimGrid(1, 1);
float a2;
cudaEvent_t t1, t2;
cudaEventCreate(&t1);
cudaEventCreate(&t2);
cudaEventRecord(t1, 0);
kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
cudaEventRecord(t2, 0);
cudaEventSynchronize(t1);
cudaEventSynchronize(t2);
cudaEventElapsedTime(&a2,t1,t2);
printf("kernel time: %f (ms)\n",a2);
如果length = 32,则内核时间为:
kernel time: 37.341919 (ms)
如果length = 33,则内核时间为:
kernel time: 0.004128 (ms)
我的设备的一些信息:
您应该提供完整的代码。然而:
length
> 32时,您将启动非法内核,并且您的内核将无法运行或产生任何结果。您可以通过在内核启动之前清除输出数据来确认这一点。例如,如果dev_D
包含内核的输出,那么执行以下操作:
cudaMemset(dev_D, 0, length*length*sizeof(dev_D[0]));
kernel<<<dimGrid, dimBlock>>>(dev_d, dev_D);
如果你这样做,并且内核无法运行,你肯定应该在dev_D
中得到0而不是预期的结果。length
参数大于32时,您要求每个块超过1024个线程,这在CUDA中是非法的。因此内核不运行(如果要确认这一点,请使用正确的CUDA错误检查。)当内核不运行时,测量的启动时间比内核运行时短得多。