【问题标题】:Sorting/reordering dependent instructions for dual issue processing对双问题处理的相关指令进行排序/重新排序
【发布时间】:2014-09-19 01:52:40
【问题描述】:

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

【问题讨论】:

    标签: sorting assembly cell instructions spu


    【解决方案1】:

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

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

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

    【讨论】:

    • nops 不是问题,spu 编译器(CC = spu-gcc / AS = spu-as)不够聪明,无法重新排序指令。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2013-12-18
      • 2021-12-02
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多