假设我有这个__device__
函数:
__device__ unsigned char* dev_kernel(unsigned char* array_sh, int params){
return array_sh + params;
}
在__global__
内核中,我以这种方式使用它:
uarray = dev_kernel (uarray, params);
其中uarray
是位于共享内存中的数组。
但是当我使用cuda-gdb查看__global__
内核中uarray
的地址时,我得到:
(@generic unsigned char * @shared) 0x1000010 "z\377*"
在__device__
内核中,我得到:
(unsigned char * @generic) 0x1000010 <Error reading address 0x1000010: Operation not permitted>
尽管有错误,程序运行正常(可能是cuda-gdb的一些限制)。
所以我想知道在__device__
内核中,uarray
是共享的吗?我将数组从全局内存改为共享内存,时间几乎相同(使用共享内存时,时间稍差)。
1条答案
按热度按时间e3bfsja21#
所以,我想知道:在
__device__
内核中,uarray
是共享的吗?是的,当你以这种方式将一个指向共享内存的指针传递给一个设备函数时,它仍然指向共享内存中的同一个地方。
为了回答下面贴出的让我困惑的问题,我选择展示一个简单的例子:
虽然您没有提供,但我假设您对
u_array
的定义与我的定义相似,这是基于您得到的cuda-gdb输出。请注意,像
@shared
这样的指示符 * 不是告诉你指针指向哪种内存 *,而是告诉你它是哪种指针(在__shared__
语句中隐式定义),或者它存储在哪里(在共享内存中)。如果这不能解决您的问题,请提供一个完整的示例,沿着完整的cuda-gdb会话输出,就像我一样。