我写了一个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*)'
问题是什么
答案 0 :(得分:4)
当编译器找到函数的原型并且在链接期间找不到对函数的引用时,会发生未定义的函数引用。要避免这种链接错误,您应该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
中。