C++ cuda实现中对函数的未定义引用

C++ cuda实现中对函数的未定义引用,c++,cuda,C++,Cuda,我编写了一个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 DeviceFun

我编写了一个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);
 }

 }
#包括
#包括
#包括“Common.h”
__设备全局无效内核(float*,float*,int);
void DeviceFunc(浮点*临时值,整数,浮点*临时值)
{
浮动*a_d,*b_d;
//设备上的内存分配
Cudamaloc(&a_d,sizeof(浮动)*(numvar)*(numvar+1));
Cudamaloc(&b_d,浮点数)*(numvar)*(numvar+1));
//将数据从主机复制到设备
cudaMemcpy(a_d,temp_h,sizeof(float)*numvar*(numvar+1),cudaMemcpyHostToDevice);
//定义螺纹块的尺寸
dim3 dimBlock(numvar+1,numvar,1);
dim3 dimGrid(1,1,1);
//内核调用
内核(a_d,b_d,numvar);
//从设备将数据传送到主机
cudaMemcpy(temp1_h,b_d,sizeof(float)*numvar*(numvar+1),cudamemcpydevicetoost);
//释放设备上的内存
cudaFree(a_d);
库达弗里(b_d);
}
}
现在,当我使用
nvcc-o main.cpp
编译代码时,我得到了以下错误
main.cpp:(.text+0x3a0):未定义对“DeviceFunc(float*,int,float*)”的引用。


当编译器找到函数的原型,而在链接过程中没有找到函数的引用时,

未定义的函数引用会出现什么问题。为了避免这种链接错误,您应该1)在一个命令中编译整个链接文件,或者2)将编译和链接过程分开。我建议后者如下:

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

请注意,显示的代码缺少包含body
Kernel
函数的文件。我假设
内核
函数的主体包含在
内核中。当编译器找到函数的原型并且在链接过程中未找到函数的引用时,就会出现未定义的函数引用。为了避免这种链接错误,您应该1)在一个命令中编译整个链接文件,或者2)将编译和链接过程分开。我建议后者如下:

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

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

中,您需要将DeviceFunc.cu构建到一个对象中,并将其链接到主应用程序中。如果cuda安装在通常的位置/usr/local/cuda,那么您可以查看/usr/local/cuda/lib中的库。其中一些人的姓名末尾最多有3个数字,如4.1.28或5.0.35。这些数字将告诉您cuda版本4.1.xx=cuda 4.1、5.0.xx=cuda 5.0使用ls/usr/local/cuda/lib或服务器上安装cuda的位置。或者,如果构建了samples/SDK,您可以运行deviceQuery示例,它将告诉您cuda版本。/usr/local/cuda/lib是4.0.17可能cuda 4.0上最简单的方法是将DeviceFunc.cu的内容编辑到main.cpp文件中。然后将main.cpp的名称改为main.cu,然后使用nvcc-o main.cu编译。我在这里有点盲目,因为您还没有显示这些文件的内容。例如,在DeviceFunc.cu中,我看到有一个对内核的正向引用,但没有实际的内核(函数)定义。所以我假设这是稍后在DeviceFunc.cut中的某个地方,这是因为在任何文件中都没有实际的内核定义。内核函数在哪里定义?您需要一个包含以下定义的文件:\全局\无效内核(…使用函数的真实定义,而不是DeviceFunc.cu中的前向引用,从根本上说,您的项目代码是不完整的。您需要将DeviceFunc.cu构建到一个对象中,并将其链接到主应用程序中。如果cuda安装在通常的位置/usr/local/cuda,那么您可以查看/usr中的库/local/cuda/lib。其中一些名称后面最多有3个数字,如4.1.28或5.0.35。这些数字将告诉您cuda版本4.1.xx=cuda 4.1,5.0.xx=cuda 5.0使用ls/usr/local/cuda/lib或服务器上安装cuda的位置。或者,如果构建了示例/SDK,您可以运行deviceQuery示例,它将告诉你cuda的版本。/usr/local/cuda/lib是4.0.17可能cuda 4.0上最简单的方法是将DeviceFunc.cu的内容编辑到main.cpp文件中。然后将main.cpp的名称改为main.cu,然后用nvcc-o main.cu编译,因为你没有显示这些文件的内容,所以我这里有点盲目n DeviceFunc.cu我看到有一个对内核的前向引用,但没有实际的内核(函数)定义。所以我假设它在DeviceFunc.cut的后面某个地方,这是因为您的任何文件中都没有实际的内核定义。内核函数定义在哪里?您需要一个包含以下定义的文件:_uuu全局u uu无效内核(…使用函数的真实定义,而不是设备中的正向引用。基本上,您的项目代码是不完整的。因此…如果没有nvcc-c Kernel.cu命令,您将如何以及在何处添加它?因此…如果没有nvcc-c Kernel.cu命令,您将如何以及在何处添加它?