1

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

4

2 回答 2

1

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

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

在这里简要浏览一下 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 以验证代码是否按您的意愿安排。编译器非常聪明,但可能需要一点点哄骗。

于 2014-10-09T11:24:28.463 回答
1

我最终使用“Assembly Visualizer” asmVis.jarjava 程序来查看可以优化的程序集部分,并手动重新排序说明。在几乎每个指令周期(双发出指令)中,我都使用奇数侧和偶数侧极大地提高了汇编函数的速度。

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

于 2015-07-26T02:20:27.383 回答