c++ - Cuda 上的段错误

标签 c++ c cuda gpu

我正在编写 CUDA 程序来处理图像。我遇到了段错误问题,我完全不知道为什么。我可能只是错过了一些小事,但在尝试纠正自己几个小时后,我无法让它运行。
根据我硬件上的 deviceQuery(GeForce310M total shmem:16384,max threads per block:512 and max block dim 521),我正在设置正确的网格、 block 和碎片内存值(至少我是这么认为的)。 这是我在段错误之前得到的输出:

Cols and Rows:
256
384
total:98304 // rows*cols
Block Size:512
Grid Size:192
shared mem:2048

下面是内核代码

__global__ void reduce_min(float *minVar,float* d_logLuminance)
{
    extern __shared__ float s_data[];   //shared memeory
    unsigned int tId = threadIdx.x;
    unsigned int global_id = blockIdx.x*blockDim.x + tId;

    //Copy to shared mem
    s_data[tId] = d_logLuminance[global_id];
    __syncthreads();

    for(unsigned int i = 1;i<blockDim.x;i*=2)
    {
        if(tId%(2*i) == 0)
        {
            s_data[tId] = min(s_data[tId],s_data[tId+i]);   
        }
        __syncthreads();
    }
    if(tId == 0)
        d_logLuminance[blockIdx.x] = s_data[0];
}

以及我分配内存和调用内核的部分

size_t size = 512;
    size_t sizeOfgrid = (numRows*numCols)/size;
    const dim3 blockSize(size,1,1); 
    const dim3 gridSize(sizeOfgrid,1,1);
    unsigned int sharedMem =(sizeof(float)*size); //Shared memory per block

    printf("%s\n%d\n%d\n%s%d\n","Cols and Rows:",numCols,numRows,"total:",numRows*numCols);
    printf("%s%d\n%s%d\n%s%d\n","Block Size:",size,"Grid Size:",sizeOfgrid,"shared mem:",sharedMem);

    float* d_lum;
    float* outData;
    checkCudaErrors(cudaMalloc(&d_lum,sizeof(float)*numRows*numCols));
        checkCudaErrors(cudaMemcpy(d_lum,d_logLuminance,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToDevice));   
    checkCudaErrors(cudaMalloc(&outData,sizeof(float)*numRows*numCols));

    reduce_min<<<gridSize,blockSize,sharedMem>>>(outData,d_lum);
    cudaDeviceSynchronize();
    checkCudaErrors(cudaGetLastError());        
    checkCudaErrors(cudaMemcpy(&min_logLum,outData,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToHost));

在此先感谢您的帮助。

最佳答案

checkCudaErrors(cudaMemcpy(&min_logLum,outData,sizeof(float)*numRows*numCols,cudaMemcpyDeviceToHost)); 这个函数产生了一个段错误,因为我懒得提(我错过了我正在编写代码),min_logLum 是float,而不是大小为numRows*numColsfloat*。所以最后我试图复制更多的内存分配。

关于c++ - Cuda 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17971411/

相关文章:

c++通过std::transform通过 vector 的索引获取 vector

c - 头文件 : type defaults to 'int' 中的结构定义

cuBLAS 同步最佳实践

c++ - 递归重启循环 (C++)

javascript - emscripten + sdl = 抛出异常 : TypeError: cannot set property 'widthNative' of undefined

c++ - 为什么链接器允许多个符号定义?

javascript - JavaScript API 是否公开用于压缩文件的内部解压器?

c++ - 这是合法的 C++ 代码吗?

c++ - TensorFlow CPU 和 CUDA 代码共享

CUDA 错误消息 : unspecified launch failure