代码之家  ›  专栏  ›  技术社区  ›  user3821901

CUDA协作组:链接错误

  •  2
  • user3821901  · 技术社区  · 7 年前

    在阅读了CUDA 9中的协作组之后,我一直在尝试在网格级别进行同步。

    我正在使用Visual Studio 2017、GTX 1060和CUDA 9.1。

    我修改了代码如下:

    __global__ void ExplicitKernel_American(/* ... */) {
        int i = threadIdx.x + blockDim.x * blockIdx.x;
        auto grid = cooperative_groups::this_grid();
        if (i < sizeS) {
            //...
            for (int j = 1; j < sizeT; ++j) {
                // ...
                grid.sync(); // __syncthreads();
            }
        }
    }
    

    而且,正如文档中所述,我这样调用我的内核:

    void* Explicit_Args[] = { &PDE_Grid, /* ... */, &sizeS, &sizeT };
    cudaLaunchCooperativeKernel(
        (void*)ExplicitKernel_American, 
        dim3((sizeS + TPB - 1) / TPB), 
        dim3(TPB),  
        Explicit_Args
    ); // TPB being 256...
    

    不幸的是,当我在内核中添加“网格”部分时,就出现了链接错误。

    error LNK2001: unresolved external symbol __fatbinwrap_38_cuda_device_runtime_compute_70_cpp1_ii_8b1a5d37
    fatal error LNK1120: 1 unresolved externals
    

    我已经设置了-rdc=true和sm\u 61,但找不到它不起作用的原因。。。有什么想法吗?

    非常感谢!

    1 回复  |  直到 7 年前
        1
  •  4
  •   Robert Crovella    5 年前

    使用协作内核启动(协作网格-CG)需要Pascal或Volta GPU,并且需要Linux或windows设备在TCC模式下运行。如果您测试 deviceProp.cooperativeLaunch 属性在设备属性结构中,我想您会发现在WDDM模式下运行的GPU上不支持该属性。

    在尝试使用协作网格启动之前,最好在代码中测试此属性。

    然而,您所问的问题是编译/链接问题。为此,我建议研究CG(协作网格)示例代码,例如 6_Advanced/reductionMultiBlockCG .对于网格同步,它绝对是一个需要设置的要求 -rdc=true (即启用可重定位设备代码链接)。取决于设置方式 -rdc=真 ,它可能无法正确应用于您的项目。概述了正确的方法 here

    这里最接近的问题似乎是您没有正确链接设备运行时库,例如:。 -lcudadevrt