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

Cuda:访问结构时遇到非法指令,cuda,Cuda,如果我运行以下程序,我会得到“遇到非法指令”。程序访问一个无符号长字符串数组 错误:../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

如果我运行以下程序,我会得到“遇到非法指令”。程序访问一个无符号长字符串数组

错误:../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;
}

这似乎是CUDA 6.5和7.0版本工具包中的一个编译器错误,它会影响计算能力3.0/3.5设备的代码生成。向NVIDIA提交了错误报告


[此答案由评论汇总而成,并作为社区wiki条目添加,以将此问题从未回答列表中删除]

您使用的CUDA和主机编译器版本是什么?这显然看起来像是我用
atomicCAS(((ul*)(a+i)->data)+threadIdx.x,0ull,0ull)尝试的编译器bug,错误仍然发生。我在问题中添加了cuda版本。最明显的建议是试试cuda 7,看看问题是否仍然存在。如果是这样的话,在NVIDAI更新代码的情况下提出错误报告,现在没有涉及任何结构。目前我没有访问CUDA 7的权限。当我有时间的时候,我会再检查一遍。我同意@Talonmes的说法,它似乎是一个bug。我已经在CUDA 6.5和CUDA 7.0(linux上)上测试了(以前的代码带有结构),并且行为是可复制的(在cc3.0/3.5上;在cc2.0上,我无法重新编程)。我已经向NVIDIA提交了一个bug(以防你没有/没有)。目前我没有任何进一步的信息。
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