Comments 8
void scalar_div_u8(const uint8_t* a, const uint8_t* b, uint8_t* out, size_t n) {
Я не эксперт и статью не дочитал пока, но я бы на месте автора тут бы поставил какой-нибудь restrict
на мутабельный указатель, просто иначе тут может убиваться дикая часть оптимизаций. Хотя лучше сравнить ибо точно не уверен. В общем, я предлагаю ещё и так глянуть, что будет и как соптимизируется:
void scalar_div_u8(const uint8_t* a, const uint8_t* b, uint8_t* restrict out, size_t n) {
В C++26 как раз завозят SIMD.
А статья годная, спасибо.
А нельзя просто заранее записать все 64k возможных результатов в таблицу?
Идея замечательная, но тогда может пострадать кеш, что в большом цикле обработки данных будет очень грустно.
Ну там на самом деле половина будет нули, потом ещё четверть - единицы и т.д. Так что не 64k значений. В целом можно написать такой код:
function div8Bit(a, b)
{
if (b === 0) return Infinity;
if (a < b) return 0;
if (a < 2 * b) return 1;
if (a < 3 * b) return 2;
...и.т.д.
}
if (a<b) сработает в половине случаев, следующий if - в четверти и т.д. по убыванию. Можно остановиться на каком-то этапе писать if'ы и остальные значения искать по таблице.
в таблицу
Цель автора с самого начала - писать векторизованный код.
Вроде как в SIMD-инструкциях нет векторизованного чтения из таблиц.
Деление беззнаковых 8-битных чисел