我需要计算代码应该提供的每个传输值的触发器数,以便在 GPU 上运行代码足以提高性能。
以下是翻牌率和假设:
1 . PCIe 16x v3.0 总线能够以 15.75 GB/s 的速率将数据从 CPU 传输到 GPU。
2 . GPU 能够执行 8 个单精度 TFLOPs/秒。
3 . CPU 能够执行 400 单精度 GFLOPs/秒。
4 . 单精度浮点数为 4 个字节。
5 . 计算可以与数据传输重叠。
6 . 数据最初放置在 CPU 中。
这样的问题如何一步步解决?
我需要计算代码应该提供的每个传输值的触发器数,以便在 GPU 上运行代码足以提高性能。
以下是翻牌率和假设:
1 . PCIe 16x v3.0 总线能够以 15.75 GB/s 的速率将数据从 CPU 传输到 GPU。
2 . GPU 能够执行 8 个单精度 TFLOPs/秒。
3 . CPU 能够执行 400 单精度 GFLOPs/秒。
4 . 单精度浮点数为 4 个字节。
5 . 计算可以与数据传输重叠。
6 . 数据最初放置在 CPU 中。
这样的问题如何一步步解决?
将假设 5 解释为意味着 CPU 不会以任何方式出现异常,就是将数据传输到 GPU。显然没有理由不使用GPU,你只能获得。
通过不考虑假设 5,问题变得更加有趣。假设在将数据从 CPU 传输到 GPU 时,CPU 无法计算,我们得出以下结论:我认为您正在寻找计算强度 (=:ci) FLOP/byte,在该值处让 CPU 停止其计算是有益的传输数据,以便 GPU 可以参与。假设您有d
字节数据要使用计算强度算法进行处理ci
。您将数据拆分d_cpu
为d_gpu
. d_cpu+d_gpu=d
它需要t_1 = d_gpu / (15.75 GB/s)
传输数据。然后你让两者都计算t_2
. 意义t_2 = ci * d_gpu / (8 TFLOP/s) = ci * d_cpu / (400 GFLOP/s)
。总时间蜂鸣t_3 = t_1 + t_2
。
如果 CPU 单独完成它需要t_4 = ci * d / (400 GFLOP/s)
。
所以两个选项同时花费的时间点是
t_3 = t_4
t_1 + t_2 = t_4
d_gpu / (15.75 GB/s) + ci * d_gpu / (8 TFLOP/s) = ci * (d_cpu + d_gpu) / (400 GFLOP/s)
和
d_gpu / (8 TFLOP/s) = d_cpu / (400 GFLOP/s)
导致
ci ~= 1.2 FLOP/byte