【发布时间】:2010-01-28 14:36:24
【问题描述】:
我正在编写一些 (arm) 内联汇编代码,这些代码在循环中处理大量 C 结构体并将一些数据存储到另一个数组中。
处理器支持 PLD 预取命令。
如果我以连续顺序访问数据,如果我在开始处理当前结构之前使用 prefetch 命令加载数组中下一个结构的 startadress,是否会提高性能?还是我应该在每次迭代中预取下一个但一个?还是提前预取一定数量的字节?
在目标数组中预取地址是否也有意义?
谢谢!
【问题讨论】:
我正在编写一些 (arm) 内联汇编代码,这些代码在循环中处理大量 C 结构体并将一些数据存储到另一个数组中。
处理器支持 PLD 预取命令。
如果我以连续顺序访问数据,如果我在开始处理当前结构之前使用 prefetch 命令加载数组中下一个结构的 startadress,是否会提高性能?还是我应该在每次迭代中预取下一个但一个?还是提前预取一定数量的字节?
在目标数组中预取地址是否也有意义?
谢谢!
【问题讨论】:
这在很大程度上取决于处理器的内部工作原理。也许预取会提高性能,也许不会,你必须查看文档。
如果处理器中有一个单独的子单元用于加载与计算子单元并行工作的数据,则可以提高性能。另请记住,预取指令是另一条指令,因此您最好只为缓存行的每个块长度发出一次,而不是更频繁,否则只会增加处理器负载并浪费时间。如果加载数据的子单元不是独立的,而你仍然发出预取指令,你甚至会面临性能下降——由于没有同时工作和处理器负载增加导致浪费时间而不会增加。
您不应该从仅写入的数组中预取数据 - 这只是浪费时间。
【讨论】: