我有几个与cuda编程和GPU架构有关的问题要问:
1.如果GPU的内存带宽为144 Gb / s且PCIe总线带宽为2.25 Gb / s,那么将具有100,000,000双倍的阵列传输到GPU需要多少毫秒?
2.鉴于GPU全局内存的大小为3Gb,您可以处理的最大阵列大小是多少?如果你必须处理一个更长的数组,你怎么能改变你的程序来完成这个?
我不知道如何计算这个,谁能帮助我,谢谢
答案 0 :(得分:2)
PCIE总线将成为限制因素。只需将总数据传输大小(以字节为单位)除以速度(以字节/秒为单位)即可获得持续时间(以秒为单位)。 2.25 Gb / s看起来不像我所知的PCIE的典型传输速度,但可能是你的系统的情况。现代系统通常可以达到~6GB / s(对于PCIE Gen2 x16链路)或~11GB / s(对于PCIE Gen3 x16链路)的速度。您可以使用bandwidthTest
CUDA示例代码测量传输速度(可能)。请注意,为了在您的应用程序中获得峰值传输吞吐量,通常需要转移到a pinned allocation(< - 提示,单击并阅读)。
如果GPU总共有3GB的内存,其中一些将被CUDA和其他系统开销用完。使用nvidia-smi
实用程序或cudaMemGetInfo()
runtime API call,剩余的“免费”金额可以估算。可用内存大约是可能的总数据存储的“上限”。您实际可以分配的金额将少于此金额。如果您确定或估计可以分配的金额,则将此数量(以字节为单位)除以要存储的数据元素的大小。例如,double
数量占用8个字节的存储空间。可以使用C库sizeof()
函数来发现这一点。将可用内存大小除以元素大小后,您将获得可以存储在该内存量中的元素总数。可行的实际金额将略低于估计金额。