C++ 如何在下一个内核中从一个cuda内核访问类
我有一个dev变量,用于使用类头在设备上分配空间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); 在返回这个内核之后,我想使用另一个内核向类方法输入数据并检索输出数据(分配器和副本已经完成并工作),例如 第二个内核对所创建的
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 );