Поймайте между двумя регистрами YMM и наполняются нулями?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Поймайте между двумя регистрами YMM и наполняются нулями?

Сообщение Anonymous »

Я хочу использовать две 256-битные регистры для выполнения операций на 10 uint32_ts. Прямо сейчас, как я это делаю, хранят первые 8 в левой регистре и оставшиеся 2 левых прокладок в правой регистрации. < /P>

Код: Выделить всё

[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, x, x, x, x, x, x] 

где x игнорируются значения. Мне нужно создать операцию, в которой я сдвигаю 10 значений влево или вправо максимум на 2 пространства < /p>
Результат левой сдвига: < /p>

Код: Выделить всё

[1, 2, 3, 4, 5, 6, 7, 8], [9, Z, x, x, x, x, x, x]

Результат двух правых смен:

Код: Выделить всё

[Z, Z, 0, 1, 2, 3, 4, 5], [6, 7, x, x, x, x, x, x]

Положения с 'z' должны быть нулевыми. Это то, что у меня есть до сих пор: < /p>

Код: Выделить всё

__m256i ind[5] = {
_mm256_setr_epi32(2, 3, 4, 5, 6, 7, 0, 1),
_mm256_setr_epi32(1, 2, 3, 4, 5, 6, 7, 0),
_mm256_setr_epi32(0, 1, 2, 3, 4, 5, 6, 7),
_mm256_setr_epi32(7, 0, 1, 2, 3, 4, 5, 6),
_mm256_setr_epi32(6, 7, 0, 1, 2, 3, 4, 5)
};

__m256i mask[5][2] = {
{_mm256_setr_epi32( 0, 0, 0, 0, 0, 0, 1, 1), _mm256_setr_epi32(-1,-1,-1,-1,-1,-1,-1,-1)},
{_mm256_setr_epi32( 0, 0, 0, 0, 0, 0, 0, 1), _mm256_setr_epi32( 1,-1,-1,-1,-1,-1,-1,-1)},
{_mm256_setr_epi32( 0, 0, 0, 0, 0, 0, 0, 0), _mm256_setr_epi32(-1,-1,-1,-1,-1,-1,-1,-1)},
{_mm256_setr_epi32(-1, 0, 0, 0, 0, 0, 0, 0), _mm256_setr_epi32( 0,-1,-1,-1,-1,-1,-1,-1)},
{_mm256_setr_epi32(-1,-1, 0, 0, 0, 0, 0, 0), _mm256_setr_epi32( 0, 0,-1,-1,-1,-1,-1,-1)}
};

__m256i zeroes[5] = {
_mm256_setr_epi32( 0, 0, 0, 0, 0, 0, 0, 0),
_mm256_setr_epi32(-1, 0, 0, 0, 0, 0, 0, 0),
_mm256_setr_epi32(-1,-1,-1,-1,-1,-1,-1,-1),
_mm256_setr_epi32( 0,-1,-1,-1,-1,-1,-1,-1),
_mm256_setr_epi32( 0, 0,-1,-1,-1,-1,-1,-1)
};

void shift(__m256i& ymml, __m256i& ymmr, int x){
if (x == 0)
return;

__m256i resl = _mm256_permutevar8x32_epi32(ymml, ind[x+2]);
__m256i resr = _mm256_permutevar8x32_epi32(ymmr, ind[x+2]);
ymml = _mm256_blendv_epi8(resl, resr, mask[x+2][0]);
ymmr = _mm256_blendv_epi8(resl, resr, mask[x+2][1]);

if (x > 0) {
ymml = _mm256_and_si256(ymml, zeroes[x+2]);
} else {
ymmr = _mm256_and_si256(ymmr, zeroes[x+2]);
}
}
Есть ли лучший способ сделать это?


Подробнее здесь: https://stackoverflow.com/questions/794 ... ith-zeroes
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»