什么原因导致CUDA内核出现分区错误?

时间:2015-07-16 11:09:49

标签: 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可能会损坏硬件。 有人可以在自己的硬件上确认问题吗?

到目前为止,似乎在调试模式下不会发生这种情况。没有其他参数(例如-use_fast_math -prec-div=false -prec-sqrt=false用于编译。

2 个答案:

答案 0 :(得分:1)

我与cuda 7.5 rc编译器(cuda 7.5.7rclinux ubuntu 14.04titan X)有同样的错误,但似乎cuda 7.5.18 (final release)已修复。

答案 1 :(得分:0)

在向Nvidia提交错误报告后,确认这是他们已经知道的编译器错误。它应该在CUDA 7.5中修复(最终,而不是RC)。