我是一个新手,正在寻求帮助,想要使用g++将一些编译好的CUDA目标代码与C++项目进行链接。之前已经有一些类似问题和解决方案发布过了(这里和这里),但是都没有对我有效,并且我似乎也找不到原因。不幸的是,我必须在Windows上进行此操作。
我尝试让下面的简单示例正常工作:
这似乎很正常。但当我试图将其链接到我的C++项目时:
我得到以下错误:
我正在使用CUDA工具包7.5,配合Visual Studio 2013和gcc版本5.2.0。
到目前为止,我尝试过:
- 使用nvcc编译所有内容。这很好用,但不符合我的项目要求。 - 使用此处中提供的解决方案,在nvcc中使用-dlink标志。不幸的是,这返回了相同的错误。 - 还有一些其他不太有成效的方法。
如果最终问题是一个愚蠢的错误,请见谅,我已经卡了一段时间了。感谢您的帮助。
我尝试让下面的简单示例正常工作:
// kernel.h
int cuda_vec_add(float *h_a, float *h_b, float *h_c, int n);
CUDA代码添加两个向量。
// kernel.cu
#include <kernel.h>
__global__ void vec_add_kernel(float *a, float *b, float *c, int n) {
int i = threadIdx.x + blockDim.x * blockIdx.x;
if (i < n) c[i] = a[i] + b[i];
}
int cuda_vec_add(float *h_a, float *h_b, float *h_c, int n) {
float *d_a, *d_b, *d_c;
cudaMalloc(&d_a, n*sizeof(float));
cudaMalloc(&d_b, n*sizeof(float));
cudaMalloc(&d_c, n*sizeof(float));
cudaMemcpy(d_a, h_a, n*sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, n*sizeof(float), cudaMemcpyHostToDevice);
vec_add_kernel<< <(n-1)/256+1,256>> >(d_a, d_b, d_c, n);
cudaMemcpy(h_c, d_c, n*sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);
return 0;
}
并且 c++ 代码调用 CUDA 函数。
// main.cpp
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <kernel.h>
using namespace std;
int main() {
const int n = 5;
float h_A[n] = { 0., 1., 2., 3., 4. };
float h_B[n] = { 5., 4., 3., 2., 1. };
float h_C[n];
cuda_vec_add(h_A, h_B, h_C, n);
printf("{ 0.0, 1.0, 2.0, 3.0, 4.0 } + { 5.0, 4.0, 3.0, 2.0, 1.0 } = { %0.01f, %0.01f, %0.01f, %0.01f, %0.01f }\n",
h_C[0], h_C[1], h_C[2], h_C[3], h_C[4]);
cin.get();
return 0;
}
我首先使用nvcc将CUDA代码编译成"kernel.o":
nvcc -I. -arch=sm_30 -c kernel.cu -o kernel.o
这似乎很正常。但当我试图将其链接到我的C++项目时:
g++ -I. -L"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64" main.cpp kernel.o -lcuda -lcudart
我得到以下错误:
Warning: corrupt .drectve at end of def file
C:\Users\Geoff\AppData\Local\Temp\cczu0qxj.o:main.cpp:(.text+0xbe):
undefined reference to `cuda_vec_add(float*, float*, float*, int)'
collect2.exe: error: ld returned 1 exit status
我正在使用CUDA工具包7.5,配合Visual Studio 2013和gcc版本5.2.0。
到目前为止,我尝试过:
- 使用nvcc编译所有内容。这很好用,但不符合我的项目要求。 - 使用此处中提供的解决方案,在nvcc中使用-dlink标志。不幸的是,这返回了相同的错误。 - 还有一些其他不太有成效的方法。
如果最终问题是一个愚蠢的错误,请见谅,我已经卡了一段时间了。感谢您的帮助。
kernel.o
上运行nm
命令,查看cuda_vec_add
函数的样子。此外,有关数据损坏的警告似乎很奇怪。 - Rudolfs Bundulis