c++ - Ptx 程序集因错误而中止

标签 c++ cuda ptx

<分区>

我曾尝试在 MS Visual Studio 2012 中的 C/CUDA 5.5 上编写用于乘法 CSR 矩阵和 vector 的程序,但遇到了 ptx 错误。 我的代码 list :

__global__ void multKernelSymm(double* s, double* u, double* val, int* rowPtr, int* colInd)
    {
        int l = 0, jl, i;
        int idx = blockDim.x*blockIdx.x;

        l = rowPtr[idx] - 1;
        for ( i = 0; i < (rowPtr[idx + 1] - rowPtr[idx]); i++){
            jl = colInd[l] - 1;
            s[idx] = s[idx] + val[l] * u[jl];
            l+=1;
        }

        l = 0;
        l = rowPtr[idx] - 1;
        for (int i = 0; i < (rowPtr[idx + 1] - rowPtr[idx]); i++){
            jl = colInd[l] - 1;
            if(jl > idx)
                atomicAdd(&s[jl], val[l] * u[idx]);
                //s[jl] = s[jl] + val[l] * u[idx];
            l+=1;
        }


    }

    __device__ double atomicAdd(double* address, double val)
    {
         unsigned long long int* address_as_ull =
         (unsigned long long int*)address;
         unsigned long long int old = *address_as_ull, assumed;
         do {
            assumed = old;
            old = atomicCAS(address_as_ull, assumed, __double_as_longlong(val + __longlong_as_double(assumed)));
         } while (assumed != old);
         return __longlong_as_double(old);
    }

这是我在 VS 中得到的:

 C:\Users\Дмитрий\Documents\Visual Studio 2012\Projects\matrix mult simple\matrix mult simple>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2012 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o x64\Debug\kernel.cu.obj "C:\Users\Дмитрий\Documents\Visual Studio 2012\Projects\matrix mult simple\matrix mult simple\kernel.cu" 
1>  ptxas C:/Users/AACE~1/AppData/Local/Temp/tmpxft_00001b88_00000000-4_kernel.ptx, line 479; : fatal error : Parsing error near '-': syntax error
1>ptxas : fatal error : Ptx assembly aborted due to errors
1>  kernel.cu
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\BuildCustomizations\CUDA 6.0.targets(597,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2012 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64"  -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\include"  -G   --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static  -g   -DWIN64 -D_DEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /Zi /RTC1 /MDd  " -o x64\Debug\kernel.cu.obj "C:\Users\Дмитрий\Documents\Visual Studio 2012\Projects\matrix mult simple\matrix mult simple\kernel.cu"" exited with code -1.
1>
 >     ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我能修好吗?

最佳答案

通过进行 3 处更改,我能够编译您的代码:

  1. 如@PaulR 所述,在调用自定义 atomicAdd 函数时删除 double 关键字。
  2. atomicAdd 的第一个参数应该是指向您要更新的地址(您要将值添加到的地址)的指针。正在传递该地址的值。所以你的函数调用应该是这样的:

    atomicAdd(&(s[jl]), val[l] * u[idx]);
    
  3. 最后,将自定义 atomicAdd 函数的声明和定义移动到内核定义之前

通过这些更改,我可以编译您的代码。

关于c++ - Ptx 程序集因错误而中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23106643/

相关文章:

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

sdk - 如何编译CUDA SDK示例?

python - OpenCV - Python 绑定(bind)中的 IPP、TBB 和 CUDA

caching - CUDA 仅对一个变量禁用 L1 缓存

c++ - 如何使用生成 .cpp 和 .h 文件的自定义生成器?

c++ - 将 Fabric (Crashlytics) 与 C++ 集成

c++ - 从函数返回时,构造函数和析构函数多久被调用一次?

cuda - NVIDIA GPU 的 CUDA 核心和 OpenCL 计算单元之间有什么关系?

c - 在cuda设备函数中使用省略号