Pull to refresh

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) { 

А нельзя просто заранее записать все 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-инструкциях нет векторизованного чтения из таблиц.

Уже есть, но не быстрое и не байтовое.

Чтение из таблицы в кэше L1 идет с темпом 2 результата за 1 такт.

То есть в районе 0.5 в табличке выше, сравнимо с лучшими результатами там.

Sign up to leave a comment.

Articles