Cuda 每个扭曲线程从共享内存加载一个相同的32字节(ulong4)

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

如果每个warp访问同一地址的共享内存,如何加载32字节的数据(ulong4)?它会被“广播”吗?访问时间是否与每个线程加载2个字节的“unsigned short int”相同


现在,如果我需要从共享内存中加载每个扭曲中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 1.x设备将浪费50%的传输数据,因为单个线程最多可以加载16个字节,但最小事务大小为1或32个字节。此外,32字节事务比128字节事务慢得多

由于最小事务大小,并且由于数据路径足够宽,每个事务可以向每个线程传输8个或16个字节,因此时间将与每个线程只读取8个字节的时间相同

在计算能力1.x上读取2倍或4倍的数据将花费2倍或4倍的时间,但在2.0和更高版本上,如果数据落入同一缓存线,则只需要最少的时间,因此不需要进一步的内存事务


因此,在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 1.x设备将浪费50%的传输数据,因为单个线程最多可以加载16个字节,但最小事务大小为1或32个字节。此外,32字节事务比128字节事务慢得多

由于最小事务大小,并且由于数据路径足够宽,每个事务可以向每个线程传输8个或16个字节,因此时间将与每个线程只读取8个字节的时间相同

在计算能力1.x上读取2倍或4倍的数据将花费2倍或4倍的时间,但在2.0和更高版本上,如果数据落入同一缓存线,则只需要最少的时间,因此不需要进一步的内存事务


因此,在compute capability 2.0及更高版本上,您无需担心。在1.x上,通过常量缓存或纹理(如果是常量)读取数据,或者在共享内存中重新排序(假设您的内核是内存带宽限制的)。

您写“读取128字节缓存线”和我的问题“每个扭曲线程是否访问共享内存…”。对共享内存的真正访问是从缓存线获取数据吗?而真正的事务大小是128字节,用于访问共享内存,与全局内存中的相同?哎呀,我就在这里。我错过了共享内存部分,而是写了关于全局的。那就得改变答案了。我只是注意到我不能否决我自己的答案…好的。现在,我稍微调整了标题,使其更明显,这是一个共享内存。关于这个问题,据我所知,一次可以获取的最大数据块是128位(ulong2)。所有扭曲线程都会将两个事务的ulong4加载到共享内存中。您可以写“读取128字节缓存线”和我的问题“如果每个扭曲线程都访问共享内存…”。对共享内存的真正访问是从缓存线获取数据吗?而真正的事务大小是128字节,用于访问共享内存,与全局内存中的相同?哎呀,我就在这里。我错过了共享内存部分,而是写了关于全局的。那就得改变答案了。我只是注意到我不能否决我自己的答案…好的。现在,我稍微调整了标题,使其更明显,这是一个共享内存。关于这个问题,我想