Писк поддерживает пространства имен?

Что вам по сути нужно сделать, это установить все байты (входных данных), которые вы хотите заменить, на ноль. Затем установите все остальные байты подстановки в ноль и ИЛИ результаты. У вас уже есть маска для этого из _mm_cmpeq_epi8. В целом, это можно сделать так:

__m128i mask = _mm_cmpeq_epi8(inp, val);
return _mm_or_si128(_mm_and_si128(mask, sub), _mm_andnot_si128(mask, inp));

Поскольку последняя комбинация и / и не / или очень распространена, SSE4.1 ввел команду, которая (по существу) объединяет их в одну:

__m128i mask = _mm_cmpeq_epi8(inp, val);
return _mm_blendv_epi8(inp, sub, mask);

На самом деле, clang5.0 и более поздние версии достаточно умны, чтобы заменить первый вариант вторым при компиляции с оптимизацией: https://godbolt.org/z/P-tcik


Примечание: если значение подстановки действительно 0x01, вы можете использовать тот факт, что маска (результат сравнения) равна 0x00 или 0xff (то есть -0x01). ), т. е. вы можете обнулить значения, которые хотите заменить, и затем вычесть маску:

__m128i val = _mm_set1_epi8(0x06);
__m128i mask = _mm_cmpeq_epi8(inp, val);
return _mm_sub_epi8(_mm_andnot_si128(mask, inp), mask);

Это может сохранить либо загрузку вектора 0x01 из памяти, либо потерю для него регистра. И в зависимости от вашей архитектуры он может иметь немного лучшую пропускную способность.

6
задан Eyvind 16 February 2009 в 09:49
поделиться

3 ответа

Как Mue говорит, он не воспринят как большая проблема в сообществе Писка. Добавление префикса "достаточно хорошо". Некоторое время назад я очень старался сделать что-то лучше и все еще поддержать уникальное чувство Smalltalk:

http://swiki.krampe.se/gohu/32

... но даже при том, что много людей думало, что было хорошо, что это не завоевало популярность. Код более или менее работает, хотя, но существует несколько других подходов также - к сожалению, большинство из них просто копирует некоторый глупый подход с меньшего языка, таким образом уничтожающего чувство Smalltalk.

9
ответ дан 8 December 2019 в 17:28
поделиться

Пространства имен не являются частью Писка сегодня. Но это - общее соглашение снабдить префиксом все классы собственного проекта с двумя или тремя буквами. Это не, как сохраняют как реальные пространства имен, но это - leightweighted, простой, и работы. +smile +

2
ответ дан 8 December 2019 в 17:28
поделиться

Кажется, что необходимо проверить Новояз.

1
ответ дан 8 December 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: