2016-05-22 12 views
0

Cファイル(.c)からcuda(.cu)ファイルに置かれたC関数を呼び出す必要があります。私はそのような階層を持っています。cファイルから.cuファイルに配置されたC関数を呼び出す方法は?

main.cの

#include <stdio.h> 

#include "dbgHelpers.h" 
#include "arffReader.h" 
#include "CPU_k_means.h" 
#include "CUDA_k_means.h" 

#include "defines.h" 

int main() { 
    //actions 
    uint cudaTime = runCudaKMeans(h_objects, objectsNum, parametersNum, clustersNum, repeatesNum, streamsNum); 
    //actions 
    return 0; 
} 

CUDA_k_means.cu

#include "CUDA_k_means.h" 

#include <cuda.h> 
#include <cuda_runtime.h> 
#include <stdio.h> 

extern "C" { 
#include "dbgHelpers.h" 
} 

__constant__ uint d_CLUST_NUM; 
__constant__ uint d_OBJ_NUM; 
__constant__ uint d_PARAMS_NUM; 
__constant__ uint d_OBJ_PER_STREAM; 
__constant__ uint d_OBJ_FOR_LAST_STREAM; 

extern __shared__ uint sharedData[]; 

__global__ void calcDistances(ptype* d_objects, ptype* d_clustersCenters, ptype* d_distances) 
{ 
    //algorithm 
} 

__global__ void clusterize(ptype* d_distances, uint* d_clustersMap) 
{ 
    //algorithm 
} 

//and more kernels 

uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum) { 
    //algorithm 
    calcDistances<<32, 32>>(); 
    //and so on 
} 

CUDA_k_means.h

#ifndef CUDA_K_MEANS_H_ 
#define CUDA_K_MEANS_H_ 

#include "defines.h" 

uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum); 

#endif 

私はそれを正しくリンクすることはできません。 NSightがこのエラーを返します。

/usr/local/cuda-7.5/bin/nvcc --cudart static --relocatable-device-code=false -gencode arch=compute_20,code=compute_20 -gencode arch=compute_20,code=sm_21 -link -o "lab5" ./CPU_k_means.o ./CUDA_k_means.o ./arffReader.o ./dbgHelpers.o ./main.o 
./main.o: In function `main': 
main.c:(.text.startup+0x8c): undefined reference to `runCudaKMeans' 
collect2: error: ld returned 1 exit status 
make: *** [lab5] Error 1 

対処方法がわかりません。私は "extern C"のさまざまな組み合わせを試みましたが、成功しませんでした。それも可能ですか?

答えて

0

最後に解決策が見つかりました。

CUDA_k_means.cuファイルにあります。

#include "CUDA_k_means.h" 

との最初の行を削除する必要があります。 CUDA_k_means.hで同じファイル機能で

それは次のようになりますので「のextern 『C』としてマークする必要があります。

extern "C" uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum) 

あなたはmain.cの関数宣言に含める必要がありますwan't場合

extern uint runCudaKMeans(ptype* h_objects, uint objectsNum, uint parametersNum, uint clustersNum, uint repeatesNum, uint streamsNum) 

完全にそれが動作する方法を説明することはできません。誰かが知っているなら、あなたはここでそれを説明することができます。

+0

十分な説明のように見えるがリンク重複で見つけることができます – talonmies

関連する問題