如何从下一个内核中的一个cuda内核访问类

Peemer

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

Neu *dev_NN;
cudaStatus = cudaMalloc((void**)&dev_NN, sizeof(Neu));

然后,我调用一个内核来初始化GPU上的类。

KGNN<<<1, threadsPerBlock>>>(dev_LaySze, dev_NN);

在内核中

__global__ void KGNN(int * dev_LaySze, Neu * NN)
{
    ...
    NN = Neu(dev_LaySze[0], dev_LaySze[1], dev_LaySze[2]);
}  

返回该内核之后,我想使用另一个内核将数据输入到类方法中并检索输出数据(分配器和副本已完成并且可以工作),例如

__global__ void KGFF(double *dev_inp,  double *dev_outp, int *DataSize)
{
    int i = threadIdx.x;
    ...
    NN.Analyse(dev_inp, dev_outp, DataSize );
}

第二个内核对创建的类一无所知。如您所料,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
$

我建议的其他更改:

  1. 在您的第一个内核中,您要传递一个指针(NN)(大概已经为其分配了设备),然后创建一个对象并将该对象复制到分配的空间中。在这种情况下,我认为您需要:

    *NN = Neu(dev_LaySze[0], dev_LaySze[1], dev_LaySze[2]);
    
  2. 在您的第二个内核中,如果NN是指针,则必须使用:

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

我已经对发布的示例进行了这两项更改。同样,我认为这只是C ++机制,而不是CUDA特有的任何东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

内核如何确定下一个pid?

如何在我的下一个内核升级中保留特定的旧内核?

如何在Linux内核模块中获取下一个TCP段?

Linux-下一个内核版本的内核树

如何从下一个片段导航到最后一个弹出的片段?

如何从列表中删除一个项目并从下一个项目开始计数?

如何访问ArrayList中的上一个/下一个元素?

从下一个键获取数组值

从下一个控件触发KeyUp事件

从下一个HTML标签获取数据

访问对象中的下一个日期

更新到下一个内核的方法是什么?

在哪里可以找到发行版本的下一个内核版本何时发布?

jQuery在列表中查找下一个类

如何在Python 3.5中访问OrderedDict中的下一个和上一个键

for 中的下一个元素

如何访问地图内的下一个/上一个对象 - 反应?

如何在下一个 useState 中访问来自一个 useState 的数据

如何在angularjs ng-repeat中访问上一个和下一个项目

如何通过 IEnumerable 访问 foreach 迭代中的下一个和上一个项目?

如何访问Django模板forloop中的下一个和上一个元素?

如何在下一个ajax调用中从一个ajax调用访问返回的变量

为什么不从下一个JVM中删除类型擦除?

无法使用 jQuery 从下一个表单中获取输入值

从下一个表CTE获取每个值的下一个值

如何定位CSS中的下一个元素?

如何迭代Ruby中的下一个元素?

如何到达HTML中的下一个元素

如何使用for循环访问列表中的下一个元素