无法链接CUBIN中间表示生成的CUDA对象文件 从英伟达,当生成PTX、CuBin或FATBIN时,主机代码从文件中被丢弃。现在我有了主机代码(main.cu)和设备代码(shared.cu)。当使用nvcc选项nvcc-c main.cu shared.cu或甚至使用nvcc-dc main.cu shared.cu将每个文件编译为*.o并使用选项nvcc-link main.o shared.o链接它们时,我可以生成可执行文件。但是当shared.cu被编译为shared.cubin并进一步编译为*.o时,链接失败,出现错误tmpxft\u 00001253\u00000000-4\u main.cudafe1.cpp:(.text+0x150):未定义的引用

无法链接CUBIN中间表示生成的CUDA对象文件 从英伟达,当生成PTX、CuBin或FATBIN时,主机代码从文件中被丢弃。现在我有了主机代码(main.cu)和设备代码(shared.cu)。当使用nvcc选项nvcc-c main.cu shared.cu或甚至使用nvcc-dc main.cu shared.cu将每个文件编译为*.o并使用选项nvcc-link main.o shared.o链接它们时,我可以生成可执行文件。但是当shared.cu被编译为shared.cubin并进一步编译为*.o时,链接失败,出现错误tmpxft\u 00001253\u00000000-4\u main.cudafe1.cpp:(.text+0x150):未定义的引用 ,cuda,linker,nvidia,nvcc,ptx,Cuda,Linker,Nvidia,Nvcc,Ptx,这里我想知道shared.cu只包含设备代码,即使删除了主机代码,为什么链接会失败 源代码文件是main.cu #include <stdio.h> #include <cuda_runtime_api.h> #include <cuda_runtime.h> #include <cuda.h> #include "shared.h" int main() { int a[5]={1,2,3,4,5}; int b

这里我想知道
shared.cu
只包含设备代码,即使删除了主机代码,为什么链接会失败

源代码文件是main.cu

#include <stdio.h>
#include <cuda_runtime_api.h>
#include <cuda_runtime.h>
#include <cuda.h>
#include "shared.h"
 int main()
{
        int a[5]={1,2,3,4,5};
        int b[5]={1,1,1,1,1};
        int c[5];
        int i;

        int *dev_a;
        int *dev_b;
        int *dev_c;

        cudaMalloc( (void**)&dev_a, 5*sizeof(int) );
        cudaMalloc( (void**)&dev_b, 5*sizeof(int) );
        cudaMalloc( (void**)&dev_c, 5*sizeof(int) );

        cudaMemcpy(dev_a, a , 5 * sizeof(int), cudaMemcpyHostToDevice);
        cudaMemcpy(dev_b, b , 5 * sizeof(int), cudaMemcpyHostToDevice);

        add<<<1,5>>>(dev_a,dev_b,dev_c);

        cudaMemcpy(&c,dev_c,5*sizeof(int),cudaMemcpyDeviceToHost);

        for(i = 0; i < 5; i++ )
        {
                printf("a[%d] + b[%d] = %d\n",i,i,c[i]);
        }
        cudaFree( dev_a);
        cudaFree( dev_b);
        cudaFree( dev_c);
        return 0;
}
#include<stdio.h>

__global__  void add(int *dev_a, int *dev_b, int *dev_c){

        //allocate shared memory
        __shared__ int a_shared[5];
        __shared__ int b_shared[5];
        __shared__ int c_shared[5];
        {
                //get data in shared memory
                a_shared[threadIdx.x]=dev_a[threadIdx.x];
                __syncthreads();

                b_shared[threadIdx.x]=dev_b[threadIdx.x];
                __syncthreads();

                //perform the addition in the shared memory space
                c_shared[threadIdx.x]= a_shared[threadIdx.x] + b_shared[threadIdx.x];
                __syncthreads();

                //shift data back to global memory
                dev_c[threadIdx.x]=c_shared[threadIdx.x];
                __syncthreads();
        }
}

我相信您假定“仅设备代码”文件(例如您的
shared.cu
)不包含主机代码。这实际上并不正确

内核函数生成主机和设备代码结构,这些结构由CUDA预处理器(cudafe)生成并拆分。请参阅中的CUDA编译轨迹

请注意,主机和设备代码最初是分离的,随后创建.cudafe1.stub.c文件,然后将其传递到主机端(即,与cubin路径分离,有效地启用链接)

如该图所示,.cudafe1.stub.c文件不会成为cubin的一部分,而是进入主机端处理流,最终成为fatbinary文件的一部分

若您只处理cubin,那个么您将丢弃这个.cudafe1.stub.c,这是创建可执行fat二进制文件的最终链接所必需的


因此,由于存根文件中缺少引用,尝试创建只有一个cubin的fat二进制链接将失败,该引用在您的问题的错误输出中指出。

我相信您假设“仅设备代码”文件(例如您的
shared.cu
)不包含主机代码。这实际上并不正确

内核函数生成主机和设备代码结构,这些结构由CUDA预处理器(cudafe)生成并拆分。请参阅中的CUDA编译轨迹

请注意,主机和设备代码最初是分离的,随后创建.cudafe1.stub.c文件,然后将其传递到主机端(即,与cubin路径分离,有效地启用链接)

如该图所示,.cudafe1.stub.c文件不会成为cubin的一部分,而是进入主机端处理流,最终成为fatbinary文件的一部分

若您只处理cubin,那个么您将丢弃这个.cudafe1.stub.c,这是创建可执行fat二进制文件的最终链接所必需的


因此,由于存根文件中缺少引用,尝试仅使用cubin创建fat二进制链接将失败,该引用在您问题的错误输出中指出。

是否可以单独生成.cudafe1.stub.c并将其与cubin/fatbin文件一起使用以进行最终链接。。。。或者,在生成fatbin/cubin时,是否有避免放弃主体构造的选项……使用标准工具链方法是不可能的。您可以尝试使用nvcc选项来保留中间文件,并使用详细输出,您可以自己复制程序集序列。我不知道你为什么要这么做。如果使用标准方法创建fat二进制文件,工具链将提供必要的链接。使用PTX和cubin主要是为了支持CUDA驱动程序API方法。唯一的想法是稍微修改一下PTX。在帖子中,我无法成功,并出现以下错误:sh:1:bin2c:未在t266.cudafe1.stub.c:1:0:t266.cudafe1.stub.c:函数“void”中的'void u sti uuu uuu cudaRegisterAll_12_t266_cpp1_ii_ea754d28()':t266.cudafe1.stub.c:2:126:错误:'uu fatDeviceText'未在此范围内声明#包括“crt/host\u runtime.h”sh:1:bin2c:not found crt/link.stub:In函数“void”\uu-cudaRegisterLinkedBinary(const\uu-fatBinC\u Wrapper\u t*,void()(void*),void*):crt/link.stub:102:60:错误:“\uu-fatDeviceText”未在此范围内声明,\udafatfatcubinhandle=\udaregisterfatbinable((void*)&\uu-fatdicetext);我猜你当时做错了什么?我只是在那里浏览了配方,它对我仍然有效。你是尝试使用我发布的脚本,还是真的从dryrun.out文件编辑了你自己的脚本?总之,我刚刚回复了你对该问题的评论,并链接到一个完整的控制台会话,演示了该过程的每个步骤s、 如果您仍然有问题,请不要尝试在一个无关问题的注释中对其进行分类--发布一个新问题。是否可以单独生成.cudafe1.stub.c并将其与cubin/fatbin文件一起使用以进行最终链接…或者是否有一个选项可以避免在生成fatbin/cubin时丢弃主机构造…这是不可能的可以使用标准的工具链方法。您可以尝试使用nvcc选项来保留中间文件,并使用详细的输出,您基本上可以自己复制程序集序列。我不确定您为什么要这样做。如果您使用标准方法创建fat二进制文件,工具链将提供必要的链接。Using PTX和cubin主要用于支持CUDA驱动程序API方法。唯一的想法是稍微修改一下PTX。在这篇文章中,我无法成功,并出现以下错误:sh:1:bin2c:在t266.cudafe1.stub.c:1:0:t266.cudafe1.stub.c:在函数“void”\uu sti\uuuu\uu\udaregisterall\u 12\u t266\u cpp1\ii中未找到_
#ifndef header
#define header

extern __global__  void add(int *dev_a, int *dev_b, int *dev_c);

#endif