gpt4 book ai didi

c++ - 对用于 cuda 实现的函数的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 02:02:21 25 4
gpt4 key购买 nike

我写了一个 cuda 应用程序,它有一个 main.cpp,其中包含一个 Common.h 文件

#include "Common.h"
int main(int argc , char **argv)
{
...
DeviceFunc(a_h , numvar , b_h); //Showing the data
....
}

然后,Common.h 包含:

 #ifndef __Common_H
#define __Common_H
#endif
void DeviceFunc(float * , int , float *);

此外,DeviceFunc.cu 位于同一文件夹中:

 #include<cuda.h>
#include<stdio.h>
#include "Common.h"
__device__ __global__ void Kernel(float *, float * ,int );
void DeviceFunc(float *temp_h , int numvar , float *temp1_h)
{
float *a_d , *b_d;
//Memory allocation on the device
cudaMalloc(&a_d,sizeof(float)*(numvar)*(numvar+1));
cudaMalloc(&b_d,sizeof(float)*(numvar)*(numvar+1));

//Copying data to device from host
cudaMemcpy(a_d, temp_h, sizeof(float)*numvar*(numvar+1),cudaMemcpyHostToDevice);

//Defining size of Thread Block
dim3 dimBlock(numvar+1,numvar,1);
dim3 dimGrid(1,1,1);

//Kernel call
Kernel<<<dimGrid , dimBlock>>>(a_d , b_d , numvar);

//Coping data to host from device
cudaMemcpy(temp1_h,b_d,sizeof(float)*numvar*(numvar+1),cudaMemcpyDeviceToHost);

//Deallocating memory on the device
cudaFree(a_d);
cudaFree(b_d);
}

}

现在,当我使用 nvcc -o main main.cpp 编译代码时,出现此错误 main.cpp:(.text+0x3a0): undefined reference to 'DeviceFunc(float *, int, float*)'

问题是什么

最佳答案

当编译器找到函数的原型(prototype)并且在链接过程中没有找到对函数的引用时,就会发生未定义的函数引用。为避免此链接错误,您应该 1) 在一个命令中编译链接整个文件,或 2) 将编译和链接过程分开。我推荐后者如下:

nvcc -c main.cpp
nvcc -c DeviceFunc.cu
nvcc -c Kernel.cu
nvcc main.o DeviceFunc.o Kernel.o -o main

请注意,您显示的代码缺少包含主体 Kernel 函数的文件。我假设 Kernel 函数的主体包含在 Kernel.cu 中。

关于c++ - 对用于 cuda 实现的函数的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13298681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com