- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CUDA 存储器种类分析及使用方法指南 寄存器
局部存储器
共享存储器
全局存储器
主机端内存
主机端页锁定内存
常数存储器
纹理存储器
存储器 位置 拥有缓存 访问权限 变量生存周期 register GPU (芯)片内 N/A device 可读/写 与thread相同 local memory 板载显存 无 device 可读/写 与thread相同 shared memory GPU 片内 N/A device 可读/写 与block相同 constant memory 板载显存 有 device 可读,host可读/写 可在程序中保持 texture memory 板载显存 有 device 可读,host可读/写 可在程序中保持 global memory 板载显存 无 device 可读/写,host可读/写 可在程序中保持 host memory host 内存 无 host 可读/写 可在程序中保持 pinned memory host 内存 无 host 可读/写 可在程序中保持 共享存储器
示例:共享存储器的动态与静态分配与初始化
int main(int argc, char** argv)
{
testKernel1, 10, mem_size(d_idata, d_odata);
CUT_EXIT(argc, argv);
}
__global__ void testKernel(float* g_idata, float* g_odata){
extern __shared__ float sdata_dynamic[]; //extern 声明,大小由主机端程序决定。动态声明
__shared__ int sdata_static[16]; //静态声明数组大小
sdata_static[tid] = 0; //shared memory 不能在定义时初始化
}
将共享存储器中的变量声明为外部数组时,数组的大小将在Kernel 启动时确定,通过其执行参数确定。通过这种方式定义的所有变量都开始于相同的地址,因此数组中的变量的布局必须通过偏移量显式管理。例:如果希望在动态分配的共享存储器内获得与以下代码对应的内容:
short array0[128];
float array1[64];
int array2[256];
应该按照下面的方式定义:
extern __shared__ char array[];
__device__ void func()
{
short* array0 = (short*)array;
float* array1 = (float*)array0[128];
int* array2 = (int*)array1[64];
}
全局存储器 显存中的全局存储器也称为线性内存。线性内存通常使用 cudaMalloc() 函数分配, cudaFree() 函数释放,并由 cudaMemcpy() 进行主机端与设备端的数据传输。通过CUDA API分配的空间未经过初始化,初始化全局存储器需要调用 cudaMemset 函数。
对于二维、三维数组,我们使用 cudaMallocPitch() 和 cudaMalloc3D() 分配线性存储空间。这些函数能够确保分配满足对齐要求。
例:分配一个尺寸为 width * height 的 float 型2D 数组,以及遍历数组元素。
//主机端代码
float* devPtr;
int pitch;
cudaMallocPitch((void**)devPtr, pitch, width * sizeof(float), height);
myKernel100, 512(devPtr, pitch);
//设备端代码
__global__ void myKernel(float* devPtr, int pitch)
{
for (int r = 0; r height; ++r){
float* row = (float*)((char*)devPtr + r * pitch);
for (int c = 0; c width; ++c){
float element = row[c];
}
}
}
例:分配一个 width * height * depth 的 float 型3D 数组,以及遍历数组元素。
//主机端代码
cudaPitchedPtr devPitchedPtr;
cudaExtent extent = make_cudaExtent(64, 64, 64);
cudaMalloc3D(devPitchedPtr, extent);
m
文档评论(0)