Cuda:nvcc&gcc&g+[ハイブリッドコンパイラプログラミング]

2142 ワード

CUDAと他のコンパイラの連用を使って、混合プログラミング
コード:
ファイル1:test 1.cu
//  :test1.cu  
#include   
#include   
#include   
  
#define ROWS 32  
#define COLS 16  
#define CHECK(res) if(res!=cudaSuccess){exit(-1);}  
__global__ void Kerneltest(int **da, unsigned int rows, unsigned int cols)  
{  
  unsigned int row = blockDim.y*blockIdx.y + threadIdx.y;  
  unsigned int col = blockDim.x*blockIdx.x + threadIdx.x;  
  if (row >>(da, ROWS, COLS);  
  res = cudaMemcpy((void*)(hc), (void*)(dc), ROWS*COLS*sizeof(int), cudaMemcpyDeviceToHost);CHECK(res)  
  
  for (r = 0; r 

ファイル2:test 2.c
#include   
  
int func(); //       
int main()  
{  
    func();  
    return 0;  
}  

ファイル3:test 3.cpp
#include   
using namespace std;  
  
extern "C" int func(); //         
int main()  
{  
    func();  
    return 0;  
}  

 
いくつかのシナリオを使用できます.
シナリオ1:
    すべてのファイルを別々にコンパイルし、最後に統合します.
    Cプログラムについて
[]$nvcc -c test1.cu  
[]$gcc  -c test2.c  
[]$gcc  -o testc test1.o test2.o -lcudart -L/usr/local/cuda/lib64  

C++プログラム
[]$nvcc -c test1.cu  
[]$g++  -c test3.cpp  
[]$g++  -o testcpp test1.o test3.o -lcudart -L/usr/local/cuda/lib64  

シナリオ2:
    CUDAプログラムを静的ライブラリにする
    Cプログラムについて
[]$nvcc -lib test1.cu -o libtestcu.a  
[]$gcc       test2.c -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testc  

    特に注意:test 2.cはリンクライブラリの前にあります
    C++の場合
    完全ドメインCは、gccをg++に、test 2.cをtest 3.cppに、
 
シナリオ3:
   CUDAプログラムをダイナミックライブラリにする
    makefile
all : c cpp   
  
c : libtestcu.so  
  gcc test2.c   -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testc  
  
cpp : libtestcu.so  
  g++ test3.cpp -ltestcu -L. -lcudart -L/usr/local/cuda/lib64 -o testcpp  
  
libtestcu.so : test1.cu  
  nvcc -o libtestcu.so -shared -Xcompiler -fPIC test1.cu  
  
  
clean :  
  rm *.so testc testcpp  -f