【问题标题】:CUDA Pointers, Calling Kernels [closed]CUDA 指针,调用内核
【发布时间】:2014-02-01 08:55:04
【问题描述】:

如果我在 C 函数中使用指针,例如:

void processCalcNorm(float* a, float* b, float* c, float* d, float* e, float* f)
    {
            *a = *a + *b;
            *c = *c + *d;
            *e = *e + *f;
    }

for(id = 0; id < 1000; id++)
    {
            processCalcNorm(&xcord[id],&lvelox[id],&ycord[id],&lveloy[id],&zcord[id],&lveloz[id]);
    }

内核在执行时应该如何调用?

【问题讨论】:

  • 哪个内核?您是建议您打算创建一个等效于 processCalcNorm 的内核,还是建议您从另一个内核或其他内核调用 processCalcNorm 的设备版本?
  • 是的,我正计划创建一个相当于 processCalcNorm 的内核!但是我如何用我想要的变量来调用它呢?
  • 我提供了一个答案,因为我觉得这样做并不难。但是,为了将来参考,不鼓励提出这样的问题(“为我编写我的 CUDA 代码”)。 SO expects:“2.请求代码的问题必须证明对正在解决的问题有最低限度的理解。包括尝试的解决方案,为什么它们不起作用,以及预期的结果。”下次我建议你自己尝试一下,并描述它的问题。这样你会学得更好,并且可以消除关于你的意图的问题。

标签: c pointers cuda kernel call


【解决方案1】:

这样的东西应该可以工作(在浏览器中编写,未经测试):

__global__ void processCalcNorm_kernel(float* a, float* b, float* c, float* d, float* e, float* f, int len)
    {
       int idx = threadIdx.x + blockDim.x*blockIdx.x;
       if (idx < len){
            a[idx] = a[idx] + b[idx];
            c[idx] = c[idx] + d[idx];
            e[idx] = e[idx] + f[idx];}
    }

#define DATA_LEN 1000
#define nTPB 256
...
processCalcNorm_kernel<<<(DATA_LEN+nTPB-1)/nTPB, nTPB>>>(d_xcord,d_lvelox,d_ycord,d_lveloy,d_zcord,d_lveloz,DATA_LEN);

其中d_... 变量是名称相似的主机变量的设备副本,适当地使用cudaMalloccudaMemcpy 调用进行设置,如下所示(以xcord 为例):

float *d_xcord;
cudaMalloc((void **)&d_xcord, DATA_LEN*sizeof(float));
cudaMemcpy(d_xcord, xcord, DATA_LEN*sizeof(float), cudaMemcpyHostToDevice);

(并为其他变量创建类似的序列)

请注意,不再需要原始 C 代码中的 for 循环,因为 GPU 通过一次调用内核有效地处理了 for 循环的每次迭代。

【讨论】:

  • 谢谢!你是救生员!
  • 如果没有定义[id],如何打印?
  • 您可以定义一个id 变量并将其打印出来,但您希望如此。我不清楚您的问题,因为您最初的问题并未说明您希望如何打印数据。如果您在打印时遇到困难,我建议发布一个新的 SO 问题。
猜你喜欢
  • 2015-11-22
  • 2014-07-21
  • 1970-01-01
  • 2021-02-07
  • 2015-07-12
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多