You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并内存访问事务估算及CUDA T1000设备属性技术问询

关于NVIDIA T1000(SM_75)CUDA设备属性与内存模型的疑问解答

设备属性查询代码与输出

以下是查询T1000设备属性的C++代码:

#include <cuda.h>
#include <stdio.h>

int main() {
    cuInit(0); CUdevice dev; cuDeviceGet(&dev, 0);

    int val; cuDeviceGetAttribute(&val, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, dev);
    printf("SM count:                    %d\n", val);
    cuDeviceGetAttribute(&val, CU_DEVICE_ATTRIBUTE_L2_CACHE_SIZE, dev);
    printf("L2 cache size:               %dM bytes\n\n", val >> 20);

    cuDeviceGetAttribute(&val, CU_DEVICE_ATTRIBUTE_MAX_REGISTERS_PER_MULTIPROCESSOR, dev);
    printf("Max registers per SM:        %dK 32-bit\n", val >> 10);
    cuDeviceGetAttribute(&val, CU_DEVICE_ATTRIBUTE_MAX_SHARED_MEMORY_PER_MULTIPROCESSOR, dev);
    printf("Max shared memory per SM:    %dK bytes\n\n", val >> 10);


    size_t bytes; cuDeviceTotalMem(&bytes, dev);
    printf("Total memory:                %luG bytes\n", bytes / 1000000000);
    cuDeviceGetAttribute(&val, CU_DEVICE_ATTRIBUTE_GLOBAL_MEMORY_BUS_WIDTH, dev);
    printf("Global memory bus width:     %d-bit\n\n", val);
}

代码运行输出:

SM count:                    14
L2 cache size:               1M bytes

Max registers per SM:        64K 32-bit
Max shared memory per SM:    64K bytes

Total memory:                4G bytes
Global memory bus width:     128-bit

核心疑问解答

1. L2缓存的共享方式

1M大小的L2缓存是所有14个SM共享的,属于全局级别的缓存资源,并非每个SM分配独立的L2空间。

2. SM寄存器的总量计算

每个SM的最大寄存器数为64K 32-bit,意味着总寄存器数是64K ×14。每个SM拥有独立的寄存器文件,彼此之间不共享寄存器资源。

3. SM共享内存的总量计算

每个SM的最大共享内存为64K字节,总共享内存是64K ×14。共享内存是SM级别的私有资源,每个SM都有自己独立的共享内存空间。

4. 本地内存与全局内存总线的关系

128-bit的全局内存总线宽度同样适用于本地内存。因为本地内存本质是全局内存的一部分,访问路径和全局内存完全一致,都会通过全局内存总线与设备内存进行数据交互。


缓存行大小与访问规则的有效性验证

对于SM_75架构(Turing架构),你提到的缓存描述完全有效:

从缓存加载数据采用固定大小的事务:L1事务为128字节,L2事务为32字节。
全局内存访问会根据架构和指令类型,选择经过L1+L2缓存或仅经过L2缓存;本地内存访问会经过L1和L2缓存;共享内存访问不经过任何缓存。

结合CUDA编程指南的补充规则:

全局内存位于设备内存中,设备内存通过32字节、64字节或128字节的内存事务进行访问。
全局内存访问始终会被L2缓存缓存。


缓存场景示例分析

当一个线程束中的32个线程均对对齐地址进行4字节内存访问时:

  • 若数据不在L2缓存中,会发起1次128字节的全局内存事务(刚好覆盖32×4字节的合并访问需求),数据加载到L2缓存后,再通过4次32字节的L2事务传递到L1缓存(因为L2的事务单位是32字节),最终供线程束使用。
  • 128字节的全局内存事务,对应128-bit总线的话,每次总线传输16字节(128bit=16byte),因此需要8次连续物理访问(128÷16=8)才能完成整个事务的数据传输。

共享内存场景示例分析

当线程束中的32个线程对对齐地址进行4字节访问并最终写入共享内存时:

  • 首先从全局内存加载数据的流程和上述缓存场景一致:1次128字节全局事务 + 4次32字节L2事务(仅当缓存未命中时)。
  • 写入共享内存时,32个线程的4字节访问对应32个32-bit字,刚好映射到32个独立的共享内存bank,因此会在一个时钟周期内完成并行访问,并非发起1次128字节的共享内存事务。共享内存的bank架构天然支持这种并行访问,此时的带宽是单bank的32倍。

内容的提问来源于stack exchange,提问作者sof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:44:59