ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
773519 Топик полностью
Ксения (10.08.2017 09:07, просмотров: 155) ответил =AlexD= на Ещё есть же ключи компиляции, которые указывают какое расширение использовать.
Нет таких ключей, т.к. использование упакованной арифметики (когда в длинные SIMD-регистры загружаются сразу несколько аргументов) нетривиально. Скажем, у AVX длина такого регистра 256 бит и в него влезают сразу 8 float'ов, что позволяет обрабатывать массив в цикле не с единичным с шагом, а сразу восьмерками. Однако в этом случае и счетчик/указатель тоже надо инкрементировать не на 1, а на 8. А в том случае, если число элементов в массиве нацело на 8 не делится, то обработать остаток отдельно, а результат присовокупить к общему (когда накапливается какая-то сумма). Поэтому остаток надо либо с единичным шагом проходить, не пользуясь упакованной арифметикой, или пользоваться ею с наложением маски (предпочтительный вариант), когда в длинные SIMD-регистры загружаются не все 8 чисел, а меньшее их число. При этом ту маску надо еще вычислить в зависимости от размера остатка от деления на 8. В тех случаях, когда требуется накопить общую сумму, то следует учесть, что после блочного сложения получится не одна сумма, тоже 8 частных сумма, т.к. сложение происходило восьмерками, а потому эти 8 сумм в самом конце следует сложить в одну общую сумму. Аналогичные операции требуются и при нахождении min и max по всей длине массива - там тоже образуется 8 кандидатов, из которых в самом конце следует выбрать одного. Короче говоря, всё это достаточно нетривиально, чтобы компилятор мог бы сделать самостоятельно.