首页 > 解决方案 > 使用 cuda 的结构内的 GPU 并行化函数

问题描述

我开始使用 cuda,试图提高我的代码速度。

所以,我有一个 chain.h 文件,我在其中定义了 Chain_1D 结构和一些函数

extern int      N;

struct Chain_1D
{
  int N_mons;

  double *x_old = (double*) malloc(sizeof(double)*N);

  float *X;

  // Allocate Unified Memory – accessible from CPU or GPU
  cudaMallocManaged(&X, N*sizeof(float));

  __global__ void step();
}; 

__global__
void Chain_1D::step()
{
  // Update x_old!
  for (int i = 0; i < N_mons; i++)    x_old[i] = X[i] ;

  int index = threadIdx.x;
  int stride = blockDim.x;


  for (int j=index ; j<N_mons ; j += stride)
  {
    if (j==0)
    {
        X[0] +=  - (x_old[2]-3*x_old[1]+2*x_old[0])*dt;
    }   else if (j==1)
    {
        X[1] +=  - (x_old[3]-4*x_old[2]+6*x_old[1]-3*x_old[0])*dt ;
    }   else if (j==N_mons-2)
    {
        X[N_mons-2] += -(x_old[N_mons-4]-4*x_old[N_mons-3]+6*x_old[N_mons-2]-3*x_old[N_mons-1])*dt;         
    }   else if (j==N_mons-1)
    {
        X[N_mons-1] += -(x_old[N_mons-3]-3*x_old[N_mons-2]+2*x_old[N_mons-1])*dt;           
    }   else
    {
        X[j] += - (x_old[j-2]+x_old[j+2]-4*x_old[j-1]-4*x_old[j+1]+6*x_old[j])*dt;
    }
  }
// Wait for GPU to finish before accessing on host
cudaDeviceSynchronize();     
}

然后我打算在main()函数(和 main.cu 文件)中使用它

Chain_1D chain;

chain.init_Chain();

for (int i = 1; i < N_runs; i++)
{
    chain.step<<<1, 200>>>();
}

cudaFree(chain.X);

它不起作用,我相信是由于这个__global__函数的定义。任何人都可以帮忙吗?

标签: c++parallel-processingcudagpu

解决方案


在执行读取它们的 CUDA 内核之前,您应该将所有必需的变量移动到 GPUN_mons (例如,like或x_old)。

cudaMallocManaged(&X, N*sizeof(float));此外,由于声明中的函数调用,我怀疑您的代码是否可以编译struct!它在 C++ 和 CUDA 中均无效。

我建议您先阅读 CUDA 教程(例如:https ://cuda-tutorial.readthedocs.io/en/latest/ )。


推荐阅读