CUDA:大内核给出了奇怪的行为

时间:2013-08-15 03:29:33

标签: cuda

我最近买了一张gtx550ti增强卡。以前在我的旧gf440卡上工作的程序失败。这是一个例子。以下程序适用于较小的内核,但是较大的内核会出错。

#include "stdio.h"

__global__ void kernel(float * d_in, float * d_out){
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int idx = x + y * blockDim.x * gridDim.x;
d_out[idx] = d_in[idx];
}


int main(){
    const dim3 gridSize(10,10);
    const dim3 blockSize(80,80);
    const int size = 800*800;
    float * h_in  = new float[size];
    float * h_out = new float[size];
    float * d_in;
    float * d_out;
    cudaMalloc((void**)&d_in, sizeof(float)*size);
    cudaMalloc((void**)&d_out, sizeof(float)*size);
    for(int i = 0; i < size; i++)
        h_in[i] = (float)i;

    cudaMemcpy(d_in, h_in, sizeof(float)*size, cudaMemcpyHostToDevice);
    kernel<<<gridSize,blockSize>>>(d_in, d_out);
    cudaMemcpy(h_out, d_out, sizeof(float)*size, cudaMemcpyDeviceToHost);

    for(int i = 0; i < size; i++)
        printf("%f\n",h_out[i]);

    cudaFree(d_in);
    cudaFree(d_out);
    return 0;
}

我预计它会在浮点数中输出索引。但它会输出一些随机浮点数:

0.131061
2.520029
9.304665
0.000189
0.242134
0.525557
0.560013

尺寸100 * 100

相反,当我切换到尺寸100 * 100时:

const dim3 gridSize(10,10);
const dim3 blockSize(10,10);
const int size = 100*100;

它工作正常(最后5个输出):

9995.000000
9996.000000
9997.000000
9998.000000
9999.000000

尺寸500 * 500

但对于较大尺寸的500 * 500:

const dim3 gridSize(10,10);
const dim3 blockSize(50,50);
const int size = 500*500;

输出错误的索引(最后5个输出):

512139.000000
512140.000000
512141.000000
512142.000000
512143.000000

我安装了CUDA 5.5。谢谢!

1 个答案:

答案 0 :(得分:1)

每当您遇到cuda代码时遇到问题,您应该proper cuda error checking

这是无效的:

    const dim3 blockSize(80,80);

这要求一个80 * 80 = 6400个线程的线程块。每个线程块没有支持6400个线程的GPU。

这也无效:

const dim3 blockSize(50,50);

2500个线程也太多了。这些配置不适用于你的任何一张卡。

这是可以接受的:

const dim3 blockSize(10,10);

在“无效”情况下,您的内核未运行。如果你做了正确的cuda错误检查,你会发现这一点,甚至可以找到可能出错的线索(无效的启动配置)。

您可能还想熟悉deviceQuery cuda示例,并研究GPU的输出。