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

Sorting 双重问题处理的排序/重新排序相关指令,sorting,assembly,cell,instructions,spu,Sorting,Assembly,Cell,Instructions,Spu,我试图编写一个排序算法来为双问题处理器(cellspu)重新排序指令。获得双问题处理指令的一种方法不应该依赖于它前面的指令(另一种方法涉及单独的管道,但我关注的是同一管道中的指令)。我知道这对编译器来说太难了,我在搜索时没有找到我需要的东西。在大多数情况下,这可以手动完成,但排序算法应确保最低的“序列计数”(相互跟随的数字或相关指令) 我的问题是,以前是否做过类似的事情?有优化的方法吗 简单的伪代码减半指令时间示例(输入:i1、i2、i3): 可以写为: v1 = i1 ^ i2; \ #v1,

我试图编写一个排序算法来为双问题处理器(cellspu)重新排序指令。获得双问题处理指令的一种方法不应该依赖于它前面的指令(另一种方法涉及单独的管道,但我关注的是同一管道中的指令)。我知道这对编译器来说太难了,我在搜索时没有找到我需要的东西。在大多数情况下,这可以手动完成,但排序算法应确保最低的“序列计数”(相互跟随的数字或相关指令)

我的问题是,以前是否做过类似的事情?有优化的方法吗

简单的伪代码减半指令时间示例(输入:
i1、i2、i3
):

可以写为:

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实现,它递归地重新排序指令,以实现最低的“序列计数”

重新排序.py

样本t8-1.h

虽然我不能专门针对单元格,但代码调度绝对是编译器应该为您做的事情

编译器将重新排序指令,根据需要填充NOPS,并尽其所能为您提供良好的代码时间表。通常,我会告诉您查看编译器的“mtune”参数(它们允许您准确地告诉编译器处理器的外观),但由于您正在为单元编码,它应该已经知道要做什么(但一定要查看编译器手册以确保)

简单浏览一下SPU的GCC编译器,可以看到以下选项:

-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,以验证代码是否按您的意愿进行了调度。编译器非常聪明,但可能需要一些哄骗

最后,我使用“Assembly Visualizer”(汇编可视化工具)asmVis.jarjava程序查看可优化的汇编部分,并手动重新排序指令。我在几乎每个指令周期(双发布指令)中使用奇数和偶数两个方面,大大提高了汇编函数的速度


TODO:将github链接添加到源代码

NOP不是问题所在,spu编译器(CC=spu gcc/AS=spu AS)不够聪明,无法重新排序指令。
-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. `