【发布时间】:2015-10-25 13:40:32
【问题描述】:
如果我运行以下程序,我会得到“遇到非法指令”。该程序访问一个无符号长整数数组。
错误:../file.cu(43):CUDA 运行时 API 错误 73:遇到非法指令。
GPU:GTX 760
Cuda 6.5 (V6.5.16)。该错误仅在以发布模式(-O3 优化标志)运行代码时发生。
代码:
#include <stdio.h>
#include <cuda_runtime.h>
typedef unsigned long long ul;
static inline void __checkCudaErrors(cudaError err, const char *file, const int line )
{
if(cudaSuccess != err){
fprintf(stderr, "%s(%i) : CUDA Runtime API error %d: %s.\n",file, line, (int)err, cudaGetErrorString( err ) );
exit(-1);
}
}
#define checkCuda(err) __checkCudaErrors (err, __FILE__, __LINE__)
__global__ void testReadOnly(ul *A)
{
int i = threadIdx.x/32;
A=A+(32*i);
atomicCAS(A+threadIdx.x, 0ull, 0ull);
}
int main(void)
{
ul *d_A = NULL;
int size = 32*sizeof(ul);
checkCuda(cudaMalloc((void **)&d_A, size));
checkCuda(cudaMemset(d_A, (int)0, size));
testReadOnly<<<1, 32>>>(d_A);
checkCuda(cudaDeviceSynchronize());
checkCuda(cudaFree(d_A));
checkCuda(cudaDeviceReset());
return 0;
}
PTX 代码:_Z12testReadOnlyPy:
MOV R1, c[0x0][0x44]
S2R R0, SR_TID.X
MOV R4, c[0x0][0x140]
LOP.AND R3, R0, -0x20
MOV R8, RZ
IADD R2.CC, R3, R0
ISET.LT.AND R0, R3, RZ, PT
IADD.X R0, R0, RZ
SHL R3, R0, 0x3
MOV R9, RZ
IMAD.U32.U32 R4.CC, R2, 0x8, R4
IMAD.U32.U32.HI R0, R2, 0x8, R3
IADD.X R5, R0, c[0x0][0x144]
ATOM.E.CAS.U64 RZ, [R4], R8, RZ
【问题讨论】:
-
您使用的是什么 CUDA 和主机编译器版本?这在我看来确实像是一个编译器错误
-
我试过
atomicCAS(((ul*)(A+i)->data)+threadIdx.x, 0ull, 0ull);,错误仍然发生。我在问题中添加了 cuda 版本。 -
显而易见的建议是尝试 CUDA 7,看看问题是否仍然存在。如果是这样,请向 NVIDIA 提交错误报告
-
我更新了代码,现在没有涉及到结构。目前我无法访问 CUDA 7。当我有我会尝试再次检查。
-
我同意@talonmies 的观点,这似乎是一个错误。我已经在 CUDA 6.5 和 CUDA 7.0(在 linux 上)上测试过(以前的代码与结构),并且行为是可重现的(在 cc3.0/3.5 上;在 cc2.0 上我无法重现)。我已经向 NVIDIA 提交了一个错误(如果您没有/没有)。我目前没有任何进一步的信息。
标签: cuda