首页 文章

C - 如果程序是使用带有所有优化标志的GCC构建的,那么Desktop-CPU的速度限制?

提问于
浏览
0

我们计划将数字信号处理程序的大部分从硬件专用芯片移植到四核等常见桌面CPU架构 . 我试图用GCC来估计这种架构的限制 . 我最感兴趣的是高SDRAM-CPU带宽[Gb / sec]和大量的每秒 32-Bit IEEE-754 floating point Multiply-Accumulate操作 .

我选择了现代桌面CPU的典型代表 -
Quad Core, about 10Mb cache, 3GHz, 45nm .
你能帮我找出它的极限吗?

1)如果将使用GCC支持使用输入标志的CPU特定指令并且将使用所有内核,则最高可能 Multiply-Accumulate operations per second . 如果我们决定将它移植到不同的CPU架构(如PowerPC上的Altivec),则源代码本身不需要更改 - 最好的选择是使用-msse或-maltivec等GCC标志 . 我建议,一个程序必须有4个线程才能利用所有可用的核心,对吧?

2) SDRAM-CPU bandwidth (最高限制,因此在主板上是独立的) .

UPDATE :自GCC 3以来,当目标支持这些指令时,GCC可以自动生成SSE / SSE2标量代码 . 自GCC 4以来,SSE / SSE2的自动矢量化已被添加.SSE4.1引入了DPPS,DPPD指令 - 用于阵列数据数据的点积 . 新的45纳米英特尔处理器支持SSE4指令 .

3 回答

  • 0

    首先,要知道您的代码很可能无法在现代矢量FPU单元上尽可能快地运行,并且可以跨架构完全移植 . 可以通过宏等抽象出架构的某些方面,但编译器(目前)只能为非常简单的程序生成几乎最优的自动矢量化代码 .

    现在,问你的问题:当前的x86硬件没有乘法累加,但是每个核心每个周期能够有一个向量加法和一个向量乘法 . 假设您的代码实现了完整的计算密度,并且您手动编写矢量代码或者您的代码足够简单以便编译器处理任务,那么可以独立于内存访问延迟实现的峰值吞吐量为:

    number of cores * cycles per second * flops per cycle * vector width
    

    在你的情况下听起来像:

    4 * 3.2 GHz * 2 vector flops/cycle * 4 floats/vector = 102.4 Gflops
    

    如果要编写标量代码,请将其除以4 . 如果您要在C语言中使用某种级别的可移植抽象来编写矢量代码,那么计划在桌面上保留一些性能,但是您可以比标量代码允许的速度快得多 . 50%的理论峰值是保守的猜测(假设算法适用于矢量化,我希望能做得更好,但请确保在估算中有一些余量) .

    edit: 关于DPPS的说明:

    DPPS不是乘法加法,并且将其作为一个加法是对当前架构的性能危害 . 在英特尔优化手册中查找,它会发现它具有11个周期的延迟,并且吞吐量每两个周期只有一个向量结果 . DPPS最多可以进行四次乘法和三次加法,因此每个循环可以获得2次乘法和1.5次加法,而使用MULPS和ADDPS可以在每个循环中获得4次 .

    更一般地说,除非绝对必要,否则应避免水平向量运算;布置您的数据,以便您的操作尽可能地保持在矢量通道内 .

    为了公平对待英特尔,如果您无法更改数据布局,并且DPPS恰好是您需要的操作,那么您希望使用它 . 请注意,通过这样做,您可以将自己限制在峰值FP吞吐量的50%以下 .

  • 3

    这可能无法直接回答您的问题,但您是否考虑过使用PC的图形卡进行并行浮点计算?它已经达到了GPU在某些任务上胜过CPU的程度;而且好处是显卡的价格相当具有竞争力 .

    我很缺乏细节,抱歉;这只是为了给你一个想法 .

  • 2

    你应该考虑以下几点:

    1)英特尔的i7架构是目前1或2个CPU的最快选择 . 仅限4个或更多插座,AMD的Opteron可以参与竞争 .

    2)英特尔的编译器生成的代码通常比其他编译器生成的代码快得多(当在AMD的CPU上使用时,你必须修补掉英特尔提出的一些CPU检查,以防止AMD看起来很好) .

    3)没有x86-CPU支持multiply-and-add然而,AMD的下一个架构“Bulldozer”可能是第一个支持它的人 .

    4)你可以在任何AMD CPU和英特尔上获得高内存带宽,仅适用于新的i7架构(插槽1366优于775) .

    5)尽可能使用Intel的高效libraries .

相关问题