我有一个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
$
我建议的其他更改:
在您的第一个内核中,您要传递一个指针(NN
)(大概已经为其分配了设备),然后创建一个对象并将该对象复制到分配的空间中。在这种情况下,我认为您需要:
*NN = Neu(dev_LaySze[0], dev_LaySze[1], dev_LaySze[2]);
在您的第二个内核中,如果NN
是指针,则必须使用:
NN->Analyse(dev_inp, dev_outp, DataSize );
我已经对发布的示例进行了这两项更改。同样,我认为这只是C ++机制,而不是CUDA特有的任何东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句