将C代码与Cuda代码链接

wol*_*k88 2 c linker cuda

所以我正在编写一个非常基本的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);
}
Run Code Online (Sandbox Code Playgroud)

这里,Test.h简单地说:

void addVec(float *, float *, float *, int);
Run Code Online (Sandbox Code Playgroud)

我的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);

        ...
}
Run Code Online (Sandbox Code Playgroud)

然后我运行命令:

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
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*lla 6

您的C/C++链接问题基本上与此处描述的相同.这是因为nvcc使用c ++编译器作为主机代码(创建c ++样式链接引用,即"mangling"),gcc将main.c解释为ac(不是c ++)文件,因此创建了c样式的链接引用.

至少有两种方法可以解决它:

  1. 将main.c转换为main.cpp并使用g ++,现在使用gcc(用于第一个和第三个编译和链接步骤).然后一切都将是c ++样式引用.
  2. 你的C++模块(vecAdd.cu)内声明的外部基准应尽可能描述空调风格在这里.