cuda - 是什么导致这个 CUDA 内核出现除法错误?

标签 cuda hardware

我最近注意到在不同硬件上运行我们的程序时出现错误。我可以追踪到内核的初始部分,其中使用模 (%) 和除法 (/) 运算符计算网格内的位置。 这是重现错误的最小工作示例:

#include <stdio.h>

__global__ void div_issue( int blocks_x, int* block_offset)
{
    int blks_x = blocks_x;


    //number of block 2d
    int block_id_2d = block_offset[0]; 

    //x-coordinate of block in absolute grid
    int block_idx = block_id_2d % blks_x;

    //y-coordinate of block in absolute grid    
    int block_idy = (block_id_2d - block_idx) / blks_x;

    printf("%d mod %d = %d \n", block_id_2d, blks_x, block_idx);
    printf("%d / %d = %d \n", block_id_2d - block_idx, blks_x, block_idy);

}    

int main(int argc, char *argv[])
{
    int dev_count;
    cudaGetDeviceCount(&dev_count);
    for (unsigned int i=0; i < dev_count; i++)
    {
        cudaSetDevice(i);
        cudaDeviceProp prop;
        cudaGetDeviceProperties(&prop, i);
        printf("using device %s :\n\n", prop.name);

        int block_offset_host[1];
        block_offset_host[0] = 753;
        int* block_offset_dev;
        cudaMalloc(&block_offset_dev, sizeof(int));
        cudaMemcpy(block_offset_dev, block_offset_host, sizeof(int), cudaMemcpyHostToDevice);

        div_issue <<<1, 1 >>>( 251 , block_offset_dev);

        cudaDeviceSynchronize();

        printf("\n");

    }
}

结果(在我有 2 个 GPU 的机器上):

using device GeForce GTX 980 Ti :
753 mod 251 = 0 
753 / 251 = 4 
using device GeForce GTX TITAN Black :
753 mod 251 = 0 
753 / 251 = 3 

我在 Windows 8 上使用 CUDA 7.0、Visual Studio 2012、9.18.13.5306 WHQL。

我没有其他提示,980Ti 可能是硬件损坏了。 有人可以在他们自己的硬件上确认这个问题吗?

到目前为止,它似乎不会在 Debug模式下发生。没有使用附加参数,例如 -use_fast_math -prec-div=false -prec-sqrt=false 进行编译。

最佳答案

我在 cuda 7.5 rc 编译器(cuda 7.5.7rc, linux ubuntu 14.04, titan X),但是它似乎已针对 cuda 7.5.18(最终版本) 进行了修复。

关于cuda - 是什么导致这个 CUDA 内核出现除法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31452510/

相关文章:

macos - 获取 RAM 信息 OSX

architecture - NVPTX 通用内存空间在架构中的位置

c - 在 CUDA 中倾斜图像

android - 如何检查手机在Android 2.1 中是否有硬件菜单按钮?

debugging - 我可以使用什么简单的方法来调试没有串口或视频的嵌入式处理器?

logic - Verilog 中的 if 语句和分配连线

hardware - 用户空间 PCI BAR 访问在每个偏移处返回 0xFF

c++ - Cusparse 非法内存访问,除非我增加稀疏矩阵的稀疏性

c++ - 带有 Boost 的 Cuda

cuda原子添加可见性