С 2 лет я разрабатываю библиотеку: cyme для выполнения вычисления SIMD над «дружественным контейнером». Я могу достичь максимальной производительности процессора. Как правило, определенные пользователем контейнер и написать ядро под следующий синтаксис (тривиальный пример):гибридный сборник скаляр/вектор на архитектуре Power7
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 единиц одновременно. Я сделал это, и мой рь начинается сейчас:
Первая версия 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 [с], тогда как гибридная версия 0.25 [с]. Мои знания в архитектуре процессоров слишком ограничены, чтобы понять, почему гибридная версия работает медленнее.
Генерирование вектора смешивания на языке ассемблера и последовательных инструкций было очаровательной идеей, поэтому, если у кого-нибудь есть предложение, возможно ли это или нет?
Бест,
++ т
ps1: а SIMD развертываться версия должна быть быстрее, я знаю, и я это сделал, но я теперь сосредоточиться на этой гибридной версии.
ps2: GCC 4.9.1, Power7-IBM, 8205-E6C
Power6 нет, но Power8 через несколько дней ... спасибо за бумагу. –