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

时间:2015-04-27 14:50:23

标签: cuda

如果我运行以下程序,我会得到#34;遇到非法指令"。该程序访问一个无符号长long数组。

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

1 个答案:

答案 0 :(得分:2)

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

[这个答案是根据评论汇总的,并作为社区维基条目添加,以便将此问题从未答复的列表中删除]