cuda内存带宽计算

cuda memory bandwidth calculation

我有几个与cuda编程和GPU架构相关的问题想请教:

1.GivenGPU的显存带宽为144Gb/s,PCIe总线带宽为2.25Gb/s,传输一个100,000,000个double的数组需要多少毫秒到 GPU?

2.GivenGPU全局内存的大小是3Gb,你能处理的最大数组大小是多少?如果您必须处理更长的数组,您如何更改程序来完成此操作?

我不知道这个怎么算,谁能帮帮我,谢谢

  1. PCIE 总线将成为这里的限制因素。只需将总数据传输大小(以字节为单位)除以速度(以 bytes/sec 为单位)即可得到持续时间(以秒为单位)。 2.25 Gb/s 看起来不像我所知道的 PCIE 的典型传输速度,但您的系统可能就是这种情况。现代系统通常可以达到 ~6GB/s(对于 PCIE Gen2 x16 link)或~11GB/s(对于 PCIE Gen3 x16 link)的速度。您可以使用 bandwidthTest CUDA 示例代码测量您的传输速度(可能)。请注意,要在您的应用程序中获得峰值传输吞吐量,通常需要传输 to/from a pinned allocation(<-- 提示,单击并阅读)。

  2. 如果 GPU 总共有 3GB 内存,其中一些将被 CUDA 和其他系统开销用完。可以使用 nvidia-smi 实用程序或 cudaMemGetInfo() runtime API call 估计 剩余的 "free" 数量。可用内存大约是可能的总数据存储量的 "upper bound"。您实际可以分配的金额将比这少一些。如果您确定或估计了您可以分配的数量,则将该数量(以字节为单位)除以您要存储的数据元素的大小。例如 double 数量占用 8 个字节的存储空间。 C 库 sizeof() 函数可用于发现这一点。将可用内存大小除以元素大小后,您将得到可以存储在该内存量中的元素总数。实际可行的数量会比估计的少一些。