2016-03-25 7 views
-2

Я рассматриваю простую проблему - ускоряя вычисление компонентного продукта двух массивов двойников. Я заметил, что с помощью команд AVX я получаю только около 20% ускорения, по сравнению с последовательным умножением в цикле.Код сборки Intel intrinsics

Я решил проверить латентность для обоих случаев и путался с ассемблере операции загрузки:

### __m256d pd; 
### pd = _mm256_load_pd(a); 
    movq  -112(%rbp), %rax //Pushing the pointer to the stack        
    vmovapd (%rax), %ymm0  //Pushing 32 bytes from memory to ymm         
    vmovapd %ymm0, -80(%rbp) //What is        
    vmovapd -80(%rbp), %ymm0 //happening here?       
    vmovapd %ymm0, -48(%rbp) //Quite slow down, since vmovapd cost ~ vmulpd       

Над частью сборки для следующего кода C:

inline int test(double * a) { 
    __m256d pd; 
    pd = _mm256_load_pd(a); 
    return 1; 
} 

в описании __m256_load_pd говорят, что это делается таким образом:

dst[255:0] := MEM[mem_addr+255:mem_addr] 
dst[MAX:256] := 0 

т. Е. В обратном порядке? Но как эти 2 строки кода сборки должны что-то сделать с этим?

+1

Вы компилируете с отключенной оптимизацией, поэтому gcc делает медленный код braindead. С оптимизацией 'test()' компилируется только в 'return 1', потому что' pd' никогда не используется. Если 20% ускорение с '-O0', то попробуйте с' -O3'. Вы должны включить оптимизацию, если хотите, чтобы код работал быстро. –

+1

Синтаксис AT & T использует 'op src2, src1, dest' с'% 'декораторами в именах регистров, тогда как синтаксис Intel использует' op dest, src1, src2'. Псевдокод руководства Intel не является asm вообще, он просто описывает операцию. –

+0

20% ускорение - результат для флага -O3 с icpc. – Tzoiker

ответ

0

Очень сложно ответить на этот вопрос без дополнительного контекста, помимо флагов компиляции. В зависимости от количества работающих потоков и размера массивов double, возможно, ваша проблема связана с памятью, то есть производительность ограничена доступом к памяти.

ОЧЕНЬ БОЛЬШИЕ ДАННЫЕ Вы хотите взглянуть на Stream эталоном. Использование встроенных средств AVX будет способствовать предварительной выборке программ и аппаратных средств, а также выравниванию данных, что может объяснить +20%. В любом случае, вы будете связаны с памятью (загрузка данных из системной памяти в кеш-память L1), а выполнение операций секвенциально будет неактуальным по сравнению с операциями AVX и, вероятно, скрыто при загрузке данных, происходящей параллельно (благодаря магии предварительной выборки).

DATA IN L2 CACHE В зависимости от количества одновременных потоков данные могут подаваться с более высоким темпом. Однако выполнение мультиплексирования данных не является достаточно сложным, чтобы вычислить данные, чтобы лидировать по стоимости сортировки памяти.

ДАННЫХ L1 КЭШ Для этого случая, вы можете увидеть некоторые улучшения в производительности, но могут быть и другие сюрпризы, такие как зависимость от выполнения и задержки, вызванной нагрузками L1-кэша. Тем не менее, загрузка согласованных данных в регистры с 256 битами, вероятно, является наиболее эффективной.

Смежные вопросы