小编Joh*_* W.的帖子

将CUDA集成到C++应用程序中以使用现有的C++类

我有一个现有的应用程序,它使用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)

c++ fortran cuda

5
推荐指数
1
解决办法
1992
查看次数

在CUDA内核中声明变量

假设您在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)
  1. "a"存储在堆栈中吗?
  2. 是否为每个线程初始化时创建了一个新的"a"?
  3. 或者每个线程是否会在未知时间独立访问"a",可能会弄乱算法?

cuda

4
推荐指数
2
解决办法
5298
查看次数

标签 统计

cuda ×2

c++ ×1

fortran ×1