【并行计算-CUDA开发】有关CUDA当中global memory如何实现合并访问跟内存对齐相关的问题
ps:这是英伟达二面面的一道相关CUDA的题目。《NVIDIA CUDA编程指南》第57页开始
global memory没有被缓存(面试答错了!),因此,使用正确的存取模式来获得最大的内存带宽,更为重要,尤其是如何存取昂贵的设备内存device
memory。
__device__ type device[32];
type data = device[tid];
编译一个单一加载指令,type必须是sizeof(type) = 4、8 或者 16 这样的,
struct __align(8)__{
float a;
float b;
};
//或者是
struct __align(16)__{
float a;
float b;
float c;
};
对于结构 > 16字节的,编译器生成几个加载指令,来保证它生成最低数量的指令,这样的结构应该用__align__(16)定义
struct __align(16)__{
float a;
float b;
float c
float d
float e;
};
//!被编译成两个128-bit的加载指令,而不是5个32-bit加载指令
其次,全局内存地址同时被每线程的一个half-warp访问(执行读和写指令)时,应该排列好,以便内存的存取可以结合进入一个接近单一的,排列好的内存存取。
HalfWarpBaseAddress + N
HalfWarpBaseAddress - BaseAddress 应该是 16 * sizeof ( type ) 的倍数
注意:如果一个half-warp满足了上面的所有需求,那么每线程的内存访问被联合了,即使half-warp的一些线程实际上没有访问内存。
BaseAddress + tid
为了获得内存的联合,type 必须符合之前讨论过的大小和队列的要求。
BaseAddress + width * ty + tx
在这样的情况下,获得 half-warp 的所有块线程的内存结合,只有当
最新文章
- Java陷阱之assert关键字
- Spring文件上传配置
- 绝对实用 NAT + VLAN +ACL管理企业网络
- [转]oracle10.2.0.1下载链接
- listbox icon
- Unity NGUI 网络斗地主 -发牌 脚本交互
- poj2096 Collecting Bugs(概率dp)
- android避免service被杀
- 临时解决linux下time wait问题
- 有关conv_std_logic_vector和conv_integer
- 201521123016《Java程序设计》第14周学习总结
- HTML5 拖放(Drag 和 Drop)详解与实例
- Nginx监控运维
- Excel转datatable
- 转: 基于elk 实现nginx日志收集与数据分析
- openssl在多平台和多语言之间进行RSA加解密注意事项
- json demo
- PHP系统编程--03.PHP进程信号处理
- Linux关于终端的基本概念汇总(tty/pty)(转)
- IIS发布的网页上传文件被拒绝
热门文章
- SpringBoot集成Druid实现监控
- 解读>;/dev/null 2>;&;1
- centos7编译安装PHP7已经把你逼到去安定医院看门诊的地步?请看此文
- GNS3错误’Could not start Telnet console with command 'Solar-PuTTY.exe‘
- 2、django后端:课程表、课程详细表
- SuperSocket实例
- js+下载文件夹
- dijkstra之zkw线段树优化
- Cogs 746. [网络流24题] 骑士共存(最大独立集)
- Go位运算