【问题标题】:Linking C code with Cuda code将 C 代码与 Cuda 代码链接
【发布时间】:2012-12-06 04:09:31
【问题描述】:

所以我正在编写一个非常基本的 CUDA 代码(向量加法)来自学 CUDA 编程的基础知识。当我编写一个 .cu 文件时,我已经让它工作了,但现在我试图让它与链接在一起的 .c 和 .cu 文件一起工作。我的 main.c 文件如下:

#include "Test.h"
#include <stdlib.h>

int main(int argc, char *argv[]) {
        int n = 1000;
        size_t size = n * sizeof(float);
        int i;

        float *h_a = malloc(size), *h_b = malloc(size), *h_c = malloc(size);

        for(i = 0; i < n; i++) {
                h_a[i] = h_b[i] = i;
        }

        addVec(h_a, h_b, h_c, n);

        exit(0);
}

这里,Test.h 简单地说:

void addVec(float *, float *, float *, int);

我的 vecAdd.cu 文件说:

#include "Test.h"

__global__ void vecAdd(float *a, float *b, float *c, int n) {
        int i = blockDim.x * blockIdx.x + threadIdx.x;

        if(i < n)
                c[i] = a[i] + b[i];
}

void addVec(float *a, float *b, float *c, int n) {
        float *d_a, *d_b, *d_c;
        size_t size = n * sizeof(float);

        cudaMalloc(&d_a, size);
        cudaMalloc(&d_b, size);
        cudaMalloc(&d_c, size);

        ...
}

然后我运行命令:

gcc -c -Wall -O3 main.c -o ../obj/main.o
nvcc -c -O3 vecAdd.cu -o ../obj/vecAdd.o
gcc -L/usr/local/cuda/lib64 -lcudart ../obj/main.o ../obj/vecAdd.o -o ../bin/nvTest

前两个工作正常。最后一个,当我尝试链接两个目标文件时,告诉我我有一个未定义的 addVec 引用,尽管它是在 vecAdd.cu 中定义的......我做错了什么?

【问题讨论】:

    标签: c linker cuda


    【解决方案1】:

    您遇到的 C/C++ 链接问题与here 中描述的问题基本相同。这是因为 nvcc 对主机代码使用 c++ 编译器(创建 c++ 样式链接引用,即“mangling”),而 gcc 将 main.c 解释为 c(不是 c++)文件,因此创建 c 样式链接引用。

    至少有两种方法可以修复它:

    1. 将您的 main.c 转换为 main.cpp 并在您现在使用 gcc 的地方使用 g++(用于您的第一个和第三个编译和链接步骤)。然后一切都将是一致的 c++ 样式引用。
    2. 在您的 C++ 模块 (vecAdd.cu) 中声明外部引用应为 C 样式,如 here 所述。

    【讨论】:

      猜你喜欢
      • 2018-12-18
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2017-05-21
      相关资源
      最近更新 更多