我尝试编写排序算法来重新排序双问题处理器(Cell SPU)的指令。获得双重问题处理指令的一种方法不应该依赖于它之前的指令(另一种方法涉及单独的流水线,但我专注于同一流水线中的指令)。我知道这对于编译器来说太多了,我在搜索时找不到我需要的东西。在大多数情况下,这可以手动完成,但排序算法应确保最低的“序列计数”(数字或相互依赖的相关指令)。
我的问题是之前有过类似的事吗?有优化的方法吗?
简单示例伪代码减半指令时间(输入:i1, i2, i3
):
v1 = i1 ^ i2; - #single-issued
v2 = v1 | i2; \ #v2,v3 dual-issued
v3 = i1 & i3; / #v2,v3 dual-issued
v4 = v3 & i2; - #single-issued
可以写成:
v1 = i1 ^ i2; \ #v1,v3 dual-issued
v3 = i1 & i3; / #v1,v3 dual-issued
v2 = v1 | i2; \ #v2,v4 dual-issued
v4 = v3 & i2; / #v2,v4 dual-issued
这是我创建的一个python实现,它递归地重新排序指令以实现最低的“序列计数”。
reorder.py
http://pastebin.com/dt8eWy3H
样本t8-1.h
http://pastebin.com/w0DYg8ff
答案 0 :(得分:1)
虽然我不能专门讨论Cell,但代码调度绝对是编译器应该为你做的事情。
编译器将重新订购说明,根据需要填写NOPS,并尽一切可能为您提供良好的代码计划。通常,我会告诉你查看编译器的“mtune”参数(它们允许你准确地告诉你的编译器你的处理器是什么样的),但是既然你正在为Cell编码,它应该已经知道该做什么了(但请确保检查编译器手册)。
简要介绍一下SPU的GCC编译器here,可以看到以下选项:
-mdual-nops=n
By default, GCC inserts nops to increase dual issue when
it expects it to increase performance. n can be a value from
0 to 10. A smaller n inserts fewer nops. 10 is the default, 0
is the same as -mno-dual-nops. Disabled with -Os. `
作为程序员,您的工作就是在代码中提供足够的“ILP”以获得良好的调度。尽量避免分支,避免在关键路径上进行长时间延迟操作等,你应该没问题。分析您的关键循环的objdump,以验证代码是否按照您的意愿进行调度。编译器非常智能,但可能需要一点点哄骗。
答案 1 :(得分:1)
我最终使用'Assembly Visualizer'asmVis.jar
java程序来查看可以优化的程序集部分,并且我手动重新排序了指令。在几乎每个指令周期(双发出指令)中,我使用奇数和偶数两侧大大提高了汇编功能的速度。
TODO:将github链接添加到源