Cuda 每个扭曲线程从共享内存加载一个相同的32字节(ulong4)
如果每个warp访问同一地址的共享内存,如何加载32字节的数据(ulong4)?它会被“广播”吗?访问时间是否与每个线程加载2个字节的“unsigned short int”相同Cuda 每个扭曲线程从共享内存加载一个相同的32字节(ulong4),cuda,gpu,gpgpu,nvidia,Cuda,Gpu,Gpgpu,Nvidia,如果每个warp访问同一地址的共享内存,如何加载32字节的数据(ulong4)?它会被“广播”吗?访问时间是否与每个线程加载2个字节的“unsigned short int”相同 现在,如果我需要从共享内存中加载每个扭曲中32/64个相同的字节,我如何才能做到这一点?在compute capability 3.0之前的设备上,共享内存访问总是32位/4字节宽,如果扭曲的所有线程都访问相同的地址,则将进行广播。更广泛的访问将编译为多条指令 使用cudaDeviceSetSharedMemConfi
现在,如果我需要从共享内存中加载每个扭曲中32/64个相同的字节,我如何才能做到这一点?在compute capability 3.0之前的设备上,共享内存访问总是32位/4字节宽,如果扭曲的所有线程都访问相同的地址,则将进行广播。更广泛的访问将编译为多条指令 使用cudaDeviceSetSharedMemConfig()可以将计算能力3.0上的共享内存访问配置为32位宽或64位宽。不过,所选设置将应用于整个内核
[由于我最初错过了问题中的“共享”一词,因此我给出了一个关于全局内存的完全脱离主题的答案。既然这个答案应该仍然正确,我就把它留在这里:] 这取决于:
- 计算能力1.0和1.1不广播和使用64个独立的32字节内存事务(两倍于16字节,扩展到warp每个线程的最小32字节事务大小)
- 计算能力1.2和1.3广播,所以两个32字节的事务(两个16字节的倍数,扩展到最小32字节事务大小)足以满足warp的所有线程
- Compute capability 2.0及更高版本只需读取一条128字节的缓存线,即可满足来自该缓存线的所有请求李>
因此,在compute capability 2.0及更高版本上,您无需担心。在1.x上,如果数据是常量,则通过常量缓存或纹理读取数据,否则在共享内存中对其重新排序(假设您的内核内存带宽受限)。在compute capability 3.0之前的设备上,共享内存访问总是32位/4字节宽,如果一个扭曲的所有线程访问相同的地址,则将进行广播。更广泛的访问将编译为多条指令 使用cudaDeviceSetSharedMemConfig()可以将计算能力3.0上的共享内存访问配置为32位宽或64位宽。不过,所选设置将应用于整个内核
[由于我最初错过了问题中的“共享”一词,因此我给出了一个关于全局内存的完全脱离主题的答案。既然这个答案应该仍然正确,我就把它留在这里:] 这取决于:
- 计算能力1.0和1.1不广播和使用64个独立的32字节内存事务(两倍于16字节,扩展到warp每个线程的最小32字节事务大小)
- 计算能力1.2和1.3广播,所以两个32字节的事务(两个16字节的倍数,扩展到最小32字节事务大小)足以满足warp的所有线程
- Compute capability 2.0及更高版本只需读取一条128字节的缓存线,即可满足来自该缓存线的所有请求李>
因此,在compute capability 2.0及更高版本上,您无需担心。在1.x上,通过常量缓存或纹理(如果是常量)读取数据,或者在共享内存中重新排序(假设您的内核是内存带宽限制的)。您写“读取128字节缓存线”和我的问题“每个扭曲线程是否访问共享内存…”。对共享内存的真正访问是从缓存线获取数据吗?而真正的事务大小是128字节,用于访问共享内存,与全局内存中的相同?哎呀,我就在这里。我错过了共享内存部分,而是写了关于全局的。那就得改变答案了。我只是注意到我不能否决我自己的答案…好的。现在,我稍微调整了标题,使其更明显,这是一个共享内存。关于这个问题,据我所知,一次可以获取的最大数据块是128位(ulong2)。所有扭曲线程都会将两个事务的ulong4加载到共享内存中。您可以写“读取128字节缓存线”和我的问题“如果每个扭曲线程都访问共享内存…”。对共享内存的真正访问是从缓存线获取数据吗?而真正的事务大小是128字节,用于访问共享内存,与全局内存中的相同?哎呀,我就在这里。我错过了共享内存部分,而是写了关于全局的。那就得改变答案了。我只是注意到我不能否决我自己的答案…好的。现在,我稍微调整了标题,使其更明显,这是一个共享内存。关于这个问题,我想