1

ファイルmain.cppを含むcudaアプリケーションを作成しました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*)'

何が問題ですか

4

1 に答える 1

4

未定義の関数参照は、コンパイラが関数のプロトタイプを見つけ、リンク中に関数への参照を見つけられなかった場合に発生します。このリンクエラーを回避するには、1)1つのコマンドでファイル全体をコンパイルリンクするか、2)コンパイルプロセスとリンクプロセスを分離する必要があります。私は後者を次のように推奨します:

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

表示されているコードには、bodyKernel関数を含むファイルが含まれていないことに注意してください。Kernel関数の本体はに含まれていると思いますKernel.cu

于 2012-11-09T07:33:10.777 に答える