2015-02-25 3 views
3

С 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

ответ

1

У меня нет какого-либо практического опыта с этим, но, по словам this PDF, это звучит как серия 7 объединена ранее отдельно скаляр и векторные единицы с плавающей запятой, чтобы сохранить пространство. Если это точно, чередование не сможет достичь какой-либо распараллеливания за пределами векторизованных инструкций.

Из реферата:

В отличии от предыдущих конструкций PowerPC, то POWER7 FPU сливается скалярный и вектора FPUs в единое целое, выполняющее три с плавающей точкой наборов команд

У вас есть доступ к POWER6 для проверки вашего чередующегося кода? Мне было бы интересно посмотреть, как это происходит.

+0

Power6 нет, но Power8 через несколько дней ... спасибо за бумагу. –