从2年开始,我正在开发一个库:
cyme,用于对“友好容器”进行SIMD计算.我能够达到处理器的最大性能.通常是用户定义的容器,并使用以下语法编写内核(简单示例):
for(i...)
W[i] = R[i]+R[i]+R[i]+R[i]+R[i];
R [i] R [i] …使用SIMD寄存器执行操作.我可以精确控制asm的生成(使用模板表达式).我完全满意,但是几天后我正在探索Power架构. Power7处理器有4个浮点单元和一个向量单元(来自维基百科我读到:“POWER7处理器有一个指令序列单元,每个周期能够向一组队列发送最多六条指令”).
我的想法是生成ASM结合串行和向量指令,因此我可以同时使用5个单元.我做到了,我的pb现在开始了:
以前代码的第一个ASM版本,纯SIMD-Power是:
.L536:
lxvd2x 0,0,9
stxvd2x 0,1,31
lxvd2x 12,0,9
stxvd2x 12,1,30
xvadddp 0,0,12
lxvd2x 12,0,9
xvadddp 0,0,12
xvadddp 0,0,12
xvadddp 0,0,12
stxvd2x 0,0,9
addi 9,9,176
cmpld 7,28,9
bne 7,.L536
“漂亮”的混合串行/ SIMD(循环执行的迭代次数较少)是:
.L547:
std 31,128(1)
std 31,136(1)
lfd 12,24(9)
stxvd2x 63,1,30
lfd 11,16(9)
fadd 10,12,12
fadd 9,11,11
fadd 10,10,12
fadd 9,9,11
fadd 10,10,12
fadd 9,9,11
lxvd2x 0,0,9
std 31,480(1)
std 31,488(1)
stfd 11,128(1)
stfd 12,136(1)
stxvd2x 63,1,29
stxvd2x 0,1,30
fadd 10,10,12
fadd 9,9,11
stfd 10,24(9)
stfd 9,16(9)
lxvd2x 10,0,9
stfd 11,480(1)
stfd 12,488(1)
stxvd2x 10,1,29
xvadddp 0,0,10
lxvd2x 12,0,9
xvadddp 0,0,12
xvadddp 0,0,12
xvadddp 0,0,12
stxvd2x 0,0,9
addi 9,9,352
cmpld 7,28,9
bne 7,.L547
第一个代码的基准(一个线程,但我应该使用两个?)是0.2 [s],而混合版本是0.25 [s].我对处理器架构的了解太有限,无法理解为什么混合版本速度较慢.
生成汇编语言混合向量和串行指令是一个很有意思的想法,所以如果有人有建议,是否可能?
最好,
Ť
ps1:SIMD unroll版本应该更快,我知道并且我做到了,但我现在专注于这个混合版本.
ps2:gcc 4.9.1,Power7-IBM,8205-E6C
最佳答案 我对这些没有任何实践经验,但根据
this PDF,听起来像7系列合并了以前单独的标量和矢量浮点单位以节省模具空间.如果这是准确的,则交错将不能实现除矢量化指令之外的任何类型的并行化.
从摘要:
Unlike previous PowerPC designs, the POWER7 FPU merges the scalar and
vector FPUs into a single unit executing three floating-point
instruction sets
您是否可以访问POWER6来测试交错代码?我很想知道这是怎么回事.