首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法链接从CUBIN中间表示生成的CUDA对象文件

无法链接从CUBIN中间表示生成的CUDA对象文件
EN

Stack Overflow用户
提问于 2016-06-21 02:11:16
回答 1查看 1.1K关注 0票数 0

从NVIDIA 文档中,当生成PTX、CUBIN或FATBIN时,主机代码将从文件中丢弃。现在我有了我的主机代码(main.cu)和设备代码(shared.cu)。当使用nvcc选项nvcc -c main.cu shared.cu或甚至使用nvcc -dc main.cu shared.cu将每个文件编译到nvcc -c main.cu shared.cu并将它们与选项nvcc -link main.o shared.o链接时,我可以生成可执行文件。但是,当shared.cu编译到shared.cubin并进一步编译到*.o时,链接就会失败,从而导致tmpxft_00001253_00000000-4_main.cudafe1.cpp:(.text+0x150): undefined reference to <KERNEL FUNCTION>错误。

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

源代码文件为main.cu

代码语言:javascript
复制
#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;
}

shared.cu

代码语言:javascript
复制
#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.h

代码语言:javascript
复制
#ifndef header
#define header

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

#endif
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-21 19:47:36

我相信您是在假设“只使用设备代码”文件(如您的shared.cu)不包含主机代码。这实际上是不对的。

内核函数同时生成主机和设备代码结构,这些结构由CUDA预处理器(cudafe)生成并拆分。请参阅文献资料中的数据自动化系统编译轨迹。

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

如图所示,.cudafe1.stub.c文件没有成为cubin的一部分,而是进入主机端处理流,最终成为胖二进制文件的一部分。

如果您只处理cubin,您将放弃这个.cudafe1.stub.c,这对于创建可执行的fat二进制文件的最终链接是必要的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37934509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档