双重问题处理的相关指令的排序/重新排序

时间:2014-09-19 01:52:40

标签: sorting assembly cell instructions spu

我尝试编写排序算法来重新排序双问题处理器(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

2 个答案:

答案 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链接添加到源