Cuda:nvcc&gcc&g+[ハイブリッドコンパイラプログラミング]
2142 ワード
CUDAと他のコンパイラの連用を使って、混合プログラミング
コード:
ファイル1:test 1.cu
ファイル2:test 2.c
ファイル3:test 3.cpp
いくつかのシナリオを使用できます.
シナリオ1:
すべてのファイルを別々にコンパイルし、最後に統合します.
Cプログラムについて
C++プログラム
シナリオ2:
CUDAプログラムを静的ライブラリにする
Cプログラムについて
特に注意:test 2.cはリンクライブラリの前にあります
C++の場合
完全ドメインCは、gccをg++に、test 2.cをtest 3.cppに、
シナリオ3:
CUDAプログラムをダイナミックライブラリにする
makefile
コード:
ファイル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