Я пишу код, который генерирует высоко оптимизированный машинный код, ориентированный на Haswell (поэтому у него есть инструкции AVX2), и я пытаюсь найти наиболее эффективный способ добавить заранее определенное количество четырехъядерных и двойных слов. Так, например, я мог бы иметь структуру, как это:Самый быстрый способ добавить смесь двойных слов и четырехъярусных слов с помощью AVX2?
0-8: QWORD a
8-16: QWORD b
16-20: DWORD c
20-28: QWORD d
28-36: QWORD e
36-40: DWORD f
40-48: QWORD g
48-56: QWORD h
56-64: QWORD i
Я хотел бы добавить это к другой структуре с одной и той же компоновке, таким образом, что (конечная) = а (первый) + а (второй), b (final) = b (первый) + b (второй) и т. д. Я смотрел инструкции VPADDUSD и VPADDUSQ, но, очевидно, ни одна из них не будет работать во всех случаях. VPADDUSD не удается добавить QWORD, которые превышают (2^32) -1. VPADDUSQ не работает, если QWORD не выравнивается по 8 байт. Я в порядке с переполнениями, в результате чего генерируются плохие данные. Я бы подумал, что неправильно спрогнозированная ветвь стоила твердых 15 циклов. Допустимо оптимизировать это для чисел, которые обычно не превышают 2^31. Идеи?
Почему бы вам не перегруппировать слова вместе и qwords вместе? –
@huseyintugrulbuyukisik Да, я думаю, это может быть лучшее, что я могу сделать. Это то, что я решил сделать для этого конкретного проекта, потому что я могу настроить макет, но это заставило меня задуматься ... есть ли способ, если я не смогу настроить порядок. Кроме того, если элементов не слишком много, для этого может потребоваться дополнительный добавочный, два дополнительных чтения и дополнительная половина тайника. –
добавляет переменные dumy в конец или между доступными? –