Tôi có ứng dụng hiện có sử dụng lớp C++, trình bao bọc C++ và mã FORTRAN cho các phần tính toán chuyên sâu của ứng dụng. Tôi muốn thực hiện các phần của FORTRAN trong CUDA để tận dụng lợi thế của song song, nhưng tôi vẫn muốn truy cập một số chương trình con, vì vậy tôi cần phải liên kết mã CUDA, C++ và FORTRAN.Tích hợp CUDA vào ứng dụng C++ để sử dụng lớp C++ hiện có
Tôi có ba câu hỏi: 1. Làm cách nào để liên kết chính xác tất cả các tệp đối tượng với Thiết bị đầu cuối Linux và với tệp Makefile (được bao gồm bên dưới)? 2. Cách thích hợp để tham chiếu hàm CUDA trong tiêu đề lớp mà không gây nhầm lẫn cho việc nhận dạng trình biên dịch của thiết bị và mã máy chủ là gì? 3. Chuyển một lớp tới CUDA giống như chuyển một lớp tới bất kỳ mã C bên ngoài nào khác?
Lưu ý: Tôi chưa bao gồm mã đầy đủ (một số trong số đó là khá dài) ngoại trừ Makefile. Nếu tôi cần bao gồm nhiều hơn, vui lòng cho tôi biết.
.h tập tin
#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 wrapper
#include "../include/DGCPM.h"
DGCPM::DGCPM(){
initialize();
}
void DGCPM::advance(float dT){
advance_(2Darray[0]);
}
tập tin 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 (Lưu ý: "PBO" là mã 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
Liên quan đến câu hỏi thứ ba của bạn, tôi đã có một mã kế thừa được viết bằng C++ và sử dụng các lớp học. Tôi đã quản lý để chuyển mã sang 'CUDA' bằng cách thay đổi tất cả các hoạt động của CPU (thực thi, chuyển động bộ nhớ, vv) thành các hoạt động GPU (hạt nhân,' cudaMemcpy ', vv). – JackOLantern