positions, std::int32_t* indexes, std::size_t count);
Собственно, эта функция должна массово на основании структуры Position рассчитывать index;
Структура Position имеет определение следующее:
struct Position {
std::int32_t x;
std::int32_t y;
}
Если представлять рассчеты без использование библиотеки eve, то это должно выглядеть примерно так
void calcIndexes(const Position* positions, std::int32_t* indexes, std::size_t count) {
for (std::size_t i = 0; i < count; ++i) {
indexes[i] = positions[i].x + positions[i].y //здесь суммирование для примера и простоты восприятия
}
}
Но я хочу использовать simd инструкции и библиотеку eve. И у меня проблема в том, как представить структуру Position в удобоваримую для eve форму. Кто что думает?
Горизонтальное суммирование?
Вообще нет, рассчет индекса в векторе по координатам x и у, суммирование просто для примера. А вообще код такой. std::size_t coords_to_offset(std::int32_t x, std::int32_t y) const { const std::int32_t size_x = static_cast<std::int32_t>(this->x); const std::int32_t size_y = static_cast<std::int32_t>(this->y); x = x - ((x / size_x) * size_x); y = y - ((y / size_y) * size_y); if (x < 0) { x = static_cast<std::int32_t>(this->x) - std::abs(x); } if (y < 0) { y = static_cast<std::int32_t>(this->y) - std::abs(y); } return y + x * this->x; }
Чаще всего у тебя компилятор сам вполне может векторизовать без сторонних библиотек, просто убедись что alignment 16 у входных данных
Ну я же не это спрашивал)
Там в примерах в твоей библиотеке есть реализация strlen, которая принимает произвольный тип
наверно вам рано лезть в SIMD, сначала надо хотя бы про operator% узнать
Не очень красиво ты мне ответил. К чему эта агрессия? Про оператор % я знаю, а еще знаю что его аналога нет в simd инструкциях. Если тебе будет спокойнее, то вот - закомменченый вариант с процентом и перемесанный метод на вариант без оного.
Можно через floating point же
Обсуждают сегодня