大约两年前,我写了一个内核,同时处理几个数字网格.出现了一些非常奇怪的行为,导致错误的结果.当利用printf() - 内核中的语句来查找错误时,bug就消失了.
由于截止日期限制,我保持这种方式,虽然最近我认为这是不合适的编码风格.所以我重新访问了我的内核并将其归结为您在下面看到的内容.
__launch_bounds__(672, 2)
__global__ void heisenkernel(float *d_u, float *d_r, float *d_du, int radius,
int numNodesPerGrid, int numBlocksPerSM, int numGridsPerSM, int numGrids)
{
__syncthreads();
int id_sm = blockIdx.x / numBlocksPerSM; // (arbitrary) ID of Streaming Multiprocessor (SM) this thread works upon - (constant over lifetime of thread)
int id_blockOnSM = blockIdx.x % numBlocksPerSM; // Block number on this specific SM - (constant over lifetime of thread)
int id_r = id_blockOnSM * (blockDim.x - 2*radius) + threadIdx.x …Run Code Online (Sandbox Code Playgroud)