【发布时间】:2018-08-09 05:56:08
【问题描述】:
我写了一个 CUDA 程序,我有两个关于这个程序的问题。
当我调用内核函数的时候,我知道block_len一定是block_len em>> 1024. 当我使用 cuda-gdb 和 Nsight 进行调试时,出现预期的“cudaLaunch 返回 (0x9)”错误。如果我在没有debug的情况下运行程序,程序运行流畅,计算结果和使用CPU一样(没有并行),说明我的计算是正确的。为什么错误的程序能得到正确的结果?
-
程序会计算出一个length * length矩阵A,A的每个元素的计算由一个线程完成,ngridDim设置为(1,1) .当length 的执行时间
kernel <<< (1,1), (length, 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)
我的设备的一些信息:
【问题讨论】: