是什么导致这个 CUDA 内核出现除法错误?
What causes division error in this CUDA kernel?
我最近注意到 运行 我们的程序在不同硬件上时出错。我可以追踪到内核的初始部分,其中使用模 (%) 和除法 (/) 运算符计算网格内的位置。
这是重现错误的最小工作示例:
#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
等附加参数
在向 Nvidia 提交错误报告后,确认这是一个他们已经知道的编译器错误。它应该在 CUDA 7.5(最终版,不是 RC)中修复。
我在 cuda 7.5 rc
编译器(cuda 7.5.7rc
、linux ubuntu 14.04
、titan X
)中遇到了同样的错误,但它似乎已为 cuda 7.5.18 (final release)
修复。
我最近注意到 运行 我们的程序在不同硬件上时出错。我可以追踪到内核的初始部分,其中使用模 (%) 和除法 (/) 运算符计算网格内的位置。 这是重现错误的最小工作示例:
#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
等附加参数
在向 Nvidia 提交错误报告后,确认这是一个他们已经知道的编译器错误。它应该在 CUDA 7.5(最终版,不是 RC)中修复。
我在 cuda 7.5 rc
编译器(cuda 7.5.7rc
、linux ubuntu 14.04
、titan X
)中遇到了同样的错误,但它似乎已为 cuda 7.5.18 (final release)
修复。