gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:31 33 4
gpt4 key购买 nike

我有一个开发变量,用于使用类 header 在设备上分配空间。

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 的任何特定内容。

关于c++ - 如何在下一个内核中从一个cuda内核访问一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446798/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com