C++ 如何在下一个内核中从一个cuda内核访问类

C++ 如何在下一个内核中从一个cuda内核访问类,c++,class,cuda,C++,Class,Cuda,我有一个dev变量,用于使用类头在设备上分配空间 Neu *dev_NN; cudaStatus = cudaMalloc((void**)&dev_NN, sizeof(Neu)); 然后我调用一个内核来初始化GPU上的类 KGNN<<<1, threadsPerBlock>>>(dev_LaySze, dev_NN); 在返回这个内核之后,我想使用另一个内核向类方法输入数据并检索输出数据(分配器和副本已经完成并工作),例如 第二个内核对所创建的

我有一个dev变量,用于使用类头在设备上分配空间

Neu *dev_NN;
cudaStatus = cudaMalloc((void**)&dev_NN, sizeof(Neu));
然后我调用一个内核来初始化GPU上的类

KGNN<<<1, threadsPerBlock>>>(dev_LaySze, dev_NN);
在返回这个内核之后,我想使用另一个内核向类方法输入数据并检索输出数据(分配器和副本已经完成并工作),例如


第二个内核对所创建的类一无所知。正如您所料,NN未被识别。如何访问第一个NN而不重新创建类并重新初始化它?必须多次调用第二个内核,记住它先前对类变量所做的更改。我不想使用CPU类,只想使用GPU,也不想每次都来回传递。

事实上,我认为这与CUDA无关。如果你在普通C++中尝试这个问题,我相信会有类似的问题(假设指针<代码> NN<代码>不是全局变量)。 正如Park Young-Bae所指出的,解决方案的关键在于将指向
NN
分配空间的指针传递给两个内核。根据我对您正在尝试做的事情的理解(因为您没有发布完整的代码),我认为需要对您展示的内容进行一些其他更改。下面是一个完整的示例:

$ cat t635.cu
#include <stdio.h>

class MC {

  int md;
  public:
  __host__ __device__ int get_md() { return md;}
  __host__ __device__ MC(int val) { md = val; }
};

__global__ void kernel1(MC *d){

  *d = MC(3);
}

__global__ void kernel2(MC *d){

  printf("val = %d\n", d->get_md());
}

int main(){

  MC *d_obj;
  cudaMalloc(&d_obj, sizeof(MC));
  kernel1<<<1,1>>>(d_obj);
  kernel2<<<1,1>>>(d_obj);
  cudaDeviceSynchronize();
  return 0;
}
$ nvcc -arch=sm_20 -o t635 t635.cu
$ ./t635
val = 3
$
  • 在第二个内核中,如果
    NN
    是指针,则必须使用:

    NN->Analyse(dev_inp, dev_outp, DataSize );
    

  • 我对我发布的示例做了这两个更改。同样,我认为这都是C++机制,而不是CUDA所特有的。< /P>作为参数传递它。将一个指针指向<代码> NN < /C>作为对第二个内核的一个参数,就像在第一个内核中一样。你会做
    NN->analysis
    而不是
    NN.analysis
    我认为这个问题与CUDA没有任何关系。在普通C++中会发现类似的问题,并且解决方案可能是相同的。ParkYoung Bae如果你想提供一个答案,我会投赞成票。我想我们可能遗漏了一些东西,因为解决方案似乎“太简单”,但不管怎样,还是投了赞成票。是的,它现在似乎起作用了,但我担心的是,第一个内核会根据LaySze中包含的大小在类中创建数组,而cudamaloc无法考虑这些。类中的数组指针可能会在调用之间跟踪这些。
    $ cat t635.cu
    #include <stdio.h>
    
    class MC {
    
      int md;
      public:
      __host__ __device__ int get_md() { return md;}
      __host__ __device__ MC(int val) { md = val; }
    };
    
    __global__ void kernel1(MC *d){
    
      *d = MC(3);
    }
    
    __global__ void kernel2(MC *d){
    
      printf("val = %d\n", d->get_md());
    }
    
    int main(){
    
      MC *d_obj;
      cudaMalloc(&d_obj, sizeof(MC));
      kernel1<<<1,1>>>(d_obj);
      kernel2<<<1,1>>>(d_obj);
      cudaDeviceSynchronize();
      return 0;
    }
    $ nvcc -arch=sm_20 -o t635 t635.cu
    $ ./t635
    val = 3
    $
    
    *NN = Neu(dev_LaySze[0], dev_LaySze[1], dev_LaySze[2]);
    
    NN->Analyse(dev_inp, dev_outp, DataSize );