gpt4 book ai didi

CUDA 指针、调用内核

转载 作者:行者123 更新时间:2023-11-30 15:40:16 32 4
gpt4 key购买 nike

如果我在 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]);
}

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

最佳答案

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

__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 循环的每次迭代。

关于CUDA 指针、调用内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094215/

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