gpt4 book ai didi

pointers - CUDA 设备指针操作

转载 作者:行者123 更新时间:2023-12-01 08:39:17 24 4
gpt4 key购买 nike

我用过:

float *devptr;
//...
cudaMalloc(&devptr, sizeofarray);
cudaMemcpy(devptr, hostptr, sizeofarray, cudaMemcpyHostToDevice);

在 CUDA C 中分配和填充数组。
现在我正在尝试运行 cuda 内核,例如:
__global__ void kernelname(float *ptr)
{
//...
}

在该数组中,但具有偏移值。
在 C/C++ 中,它会是这样的:
kernelname<<<dimGrid, dimBlock>>>(devptr+offset);

但是,这似乎不起作用。

有没有办法做到这一点,而无需在单独的参数中将偏移值发送到内核并在内核代码中使用该偏移量?
关于如何做到这一点的任何想法?

最佳答案

指针算术在 CUDA 中工作得很好。您可以在主机代码中向 CUDA 指针添加偏移量,它会正常工作(记住偏移量不是字节偏移量,它是一个简单的字或元素偏移量)。

编辑:一个简单的工作示例:

#include <cstdio>
int main(void)
{

const int na = 5, nb = 4;
float a[na] = { 1.2, 3.4, 5.6, 7.8, 9.0 };
float *_a, b[nb];

size_t sza = size_t(na) * sizeof(float);
size_t szb = size_t(nb) * sizeof(float);

cudaFree(0);

cudaMalloc((void **)&_a, sza );
cudaMemcpy( _a, a, sza, cudaMemcpyHostToDevice);
cudaMemcpy( b, _a+1, szb, cudaMemcpyDeviceToHost);

for(int i=0; i<nb; i++)
printf("%d %f\n", i, b[i]);

cudaThreadExit();
}

在这里,您可以看到第二个 cudaMemcpy 中的设备指针已应用字/元素偏移量。调用从第二个单词开始复制,而不是第一个。

关于pointers - CUDA 设备指针操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909485/

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