私はアプリケーションの計算集約的な部分にC++クラス、C++ラッパー、およびFORTRANコードを使用する既存のアプリケーションを持っています。私は並列化を利用するためにCUDAでFORTRANの一部を実装したいと思いますが、私はまだサブルーチンのいくつかにアクセスしたいので、CUDA、C++、FORTRANのコードをリンクする必要があります。既存のC++クラスを使用するC++アプリケーションへのCUDAの統合
私は3つの質問を持っています: 1.すべてのオブジェクトファイルをLinux TerminalとMakefile(以下に含まれています)と正しくリンクするにはどうしたらいいですか? 2.コンパイラのデバイスとホストコードの認識を混乱させることなく、クラスヘッダのCUDA関数を参照する適切な方法は何ですか? 3.他の外部のCコードにクラスを渡すのと同じように、クラスをCUDAに渡していますか?
注:Makefileを除いて、完全なコードは含まれていません(かなり長いものもあります)。もっと含める必要がある場合は、教えてください。
.hファイル
#ifndef _DGCPM_H_
#define _DGCPM_H_
extern "C"{
#include <string.h>
#include <zlib.h>
#include <math.h>
}
/* Prototypes of Fortran subroutines */
extern "C" {
void initialize_(float *2Darray);
void advance_(float *2Darray);
//Want "advance" to be implemented in CUDA
}
/* Proper prototype of CUDA call? */
//extern "C" void cudaadvance(float *2Darray);
class DGCPM{
public:
DGCPM(); /* Initialized with defaults setup */
~DGCPM(); /* Free memory */
void advance(float dT); /* Advance model dT seconds */
private:
float **2Darray;
void initialize(float **2Darray);
};
#endif
.Cラッパー
#include "../include/DGCPM.h"
DGCPM::DGCPM(){
initialize();
}
void DGCPM::advance(float dT){
advance_(2Darray[0]);
}
MAIN.Cファイル
#include <stdlib.h>
#include <stdio.h>
#include <zlib.h>
#include "../include/DGCPM.h"
int main(){
class DGCPM *model;
model=new class DGCPM();
//Write data to class from a file, then
for(int i=0;i<200;i++){
printf("%d\n",i);
model->advance(3600);
//write model state to file;
}
//Close file
return 0;
}
のMakefile(注: "PBO" はFORTRANコードである)
INSTALLDIR=../../lib/
FLAGS=-Wall -g -I ../../amj/include
CFLAGS=$(FLAGS)
CPPFLAGS=$(FLAGS)
FFLAGS=$(FLAGS)
CPP=g++
CC=gcc
FC=g77
PBO_PATH=../ober/for/
VPATH=$(PBO_PATH)
DGCPM_OBJ=DGCPM.o pbo.o
TESTDGCPM_OBJ=testDGCPM.o DGCPM.o pbo.o
ALL_OBJ=$(TESTDGCPM_OBJ)
install: all
mkdir -p $(INSTALLDIR)
cp libDGCPM.a $(INSTALLDIR)
all: libDGCPM.a testDGCPM
libDGCPM.a: $(DGCPM_OBJ)
ar rc [email protected] $^
testDGCPM: $(TESTDGCPM_OBJ)
$(CPP) -o [email protected] $^ -L ../../amj/lib -lamjMemory -lg2c -lz
clean:
- rm $(ALL_OBJ)
- rm $(INSTALLDIR)/libDGCPM.a
3番目の質問について、私はC++で書かれたレガシーコードを使用していました。私は、GPU操作(カーネル、 'cudaMemcpy'など)にすべてのCPU操作(実行、メモリ移動など)を変更するだけで、コードを' CUDA'に移植することができました。 – JackOLantern