gpt4 book ai didi

memory - CUDA 中全局内存和常量内存的使用

转载 作者:行者123 更新时间:2023-12-04 20:21:28 24 4
gpt4 key购买 nike

嘿,
我有以下一段代码:

#if USE_CONST == 1
__constant__ double PNT[ SIZE ];
#else
__device__ double *PNT;
#endif

稍后我有:
#if USE_CONST == 0
cudaMalloc((void **)&PNT, sizeof(double)*SIZE);
cudaMemcpy(PNT, point, sizeof(double)*SIZE, cudaMemcpyHostToDevice);
#else
cudaMemcpyToSymbol(PNT, point, sizeof(double)*SIZE);
#endif

point是在之前的代码中定义的某个地方。与 USE_CONST=1 一起工作时一切都按预期工作,但是在没有它的情况下工作时,则不然。我通过访问内核函数中的数组
PNT[ index ]
这两种变体之间的问题在哪里?
谢谢!

最佳答案

CUDA 4.0 之前 cudaMemcpyToSymbol 的正确用法是:

cudaMemcpyToSymbol("PNT", point, sizeof(double)*SIZE)

或者:
double *cpnt;
cudaGetSymbolAddress((void **)&cpnt, "PNT");
cudaMemcpy(cpnt, point, sizeof(double)*SIZE, cudaMemcpyHostToDevice);

如果您计划从主机 API 多次访问符号,这可能会更快一些。

编辑:误解了这个问题。对于全局内存版本,做一些类似于第二个版本的常量内存
double *gpnt;
cudaGetSymbolAddress((void **)&gpnt, "PNT");
cudaMemcpy(gpnt, point, sizeof(double)*SIZE. cudaMemcpyHostToDevice););

关于memory - CUDA 中全局内存和常量内存的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038286/

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