我有一个现有的应用程序,它使用C++类,C++包装器和FORTRAN代码,用于应用程序的计算密集型部分.我想在CUDA中实现FORTRAN的一部分以利用并行化,但我仍然希望访问一些子例程,因此我需要链接CUDA,C++和FORTRAN代码.
我有三个问题:1.如何正确链接所有目标文件与Linux终端和Makefile(包含在下面)?2.在不混淆编译器对设备和主机代码的识别的情况下,在类头中引用CUDA函数的正确方法是什么?3.将类传递给CUDA就像将类传递给任何其他外部C代码一样?
注意:除了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 …Run Code Online (Sandbox Code Playgroud) 假设您在CUDA内核中声明一个新变量,然后在多个线程中使用它,例如:
__global__ void kernel(float* delt, float* deltb) {
int i = blockIdx.x * blockDim.x + threadIdx.x;
float a;
a = delt[i] + deltb[i];
a += 1;
}
Run Code Online (Sandbox Code Playgroud)
并且内核调用看起来像下面这样,有多个线程和块:
int threads = 200;
uint3 blocks = make_uint3(200,1,1);
kernel<<<blocks,threads>>>(d_delt, d_deltb);
Run Code Online (Sandbox Code Playgroud)