0

我有一个代码可以顺序访问约 4GB 的内存,每个请求访问 1024 位,随机访问所有 4GB ......我有一个 16GB HBM2 和 4096 位 BUS 的 RADEON VII。

可能的优化 1:每个内存请求 4GB 和 4x 数据!(不起作用,因为第一个请求告诉我跨 4GB 的第二个请求,所以第二个请求所需的数据可能在内存中很远)

可能的优化 2:每个内存请求 4+4+4+4GB 和 1x 数据!(不会提高性能,因为对 4GB 组的每个请求都会将其他请求延迟到 0.25 倍性能,所以我得到 4 个线程,每个线程的性能为 0.25 倍)

问题:

对于优化 1 - 是否可以拆分 4096 位 BUS,所以我可以以非阻塞方式并行获取 1024 位内存的不同区域?

对于优化 2 - 是否可以并行处理 4GB 的“块”,每个块都是独立的,而其他块是非阻塞的?

PS - 我知道这取决于内存控制器,所以如果你知道可以做到这一点的不同硬件,也请告诉我。

4

1 回答 1

1

是否可以并行访问 HBM2?

是的,HBM2 总是并行访问,但这不取决于你。

您提出的两个优化都不起作用。OpenCL 不能让您控制如何使用内存总线或分配内存的位置;这取决于司机。如果您分配 4GB,则这些 4GB 不会仅分配在 4 个 HBM2 内存裸片中的一个上,而是自动分配给所有 4 个裸片以最大化带宽。

你能做的最好的事情是确保你有合并的内存访问(结构数据布局数组),并用所有工作 itms / 工作组使 GPU 饱和。Radeon VII(我也用一堆)的理论带宽为 1024GB/s,但实际上不会超过 800GB/s。

于 2020-10-17T08:47:53.463 回答