Cuda:访问结构时遇到非法指令



如果我运行以下程序,我会得到"遇到非法指令"。程序访问一个无符号的长整型数组。

错误:。。/file.cu(43):CUDA 运行时 API 错误 73:遇到非法指令。

显卡: GTX 760

库达 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 6.5 和 7.0 发布工具包中的编译器错误,它会影响计算能力 3.0/3.5 设备的代码生成。向 NVIDIA 提出了错误报告。

[此答案是根据评论收集的,并作为社区维基条目添加,以将此问题从未回答列表中删除]