gpt4 book ai didi

从全局函数调用设备函数

转载 作者:太空宇宙 更新时间:2023-11-04 00:55:12 25 4
gpt4 key购买 nike

我应该如何访问“print”函数中的“dost”函数(查看代码)?为什么在不使用 cudaMemcpy 的情况下有“N”(查看代码)变量/常量对 GPU 可见?

 __device__ void do_sth(char *a, int N)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if(idx < N)
{
a[idx] = a[idx];
}
}


__global__ void print(char *a, int N)
{
//question_1: why there is an access to N, it is now in GPU memory, how?
int idx = blockIdx.x * blockDim.x + threadIdx.x;

//do_sth<<<nblock2,blocksize2>>>(a,N); //error_1: a host function call can not be configured
//do_sth(&&a,N); //error_2: expected an expression

if(idx<N)
{
a[idx]=a[idx];
}
}

最佳答案

  • __global__ 函数(又名“内核”)已经驻留在 GPU 上。它的所有参数(变量 aN)在调用时通过共享或常量内存(取决于您的设备类型)传递,因此您可以直接访问这些变量。参数大小有限制 - 在 Fermi 之前的卡上为 256B,在 Fermi 上为 16KB(?) 4KB,因此如果您有大块数据要传输,则无法避免 cudaMemcpy 函数。

  • __global__ 函数参数不应被修改。

  • __global__ 调用 __device__ 时,您在三重括号中指定配置参数。 __device__ 函数将被所有到达内核调用的线程调用。请注意,您可以从 if 语句中调用函数,以防止某些线程执行它。

  • 在当前版本的 CUDA 中,不可能在内核执行期间产生更多线程。

  • CUDA C++中没有一元运算符&&(普通C++中没有这样的运算符,现在新标准出台了还不确定)

关于从全局函数调用设备函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5254574/

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