Цель кода — вычесть из каждого символа строки str значение в массиве ключей. Невекторизованная версия программы соответствует последнему циклу в обеих программах. Как этот код:
void decode(const char* key, int m, char* str) {
int i; int n = strlen(str);
__m128i k = _mm_loadu_si128((const __m128i*) key);
for (int i = 0; i + 16 < n; i+=m) {
__m128i s = _mm_loadu_si128((__m128i*) (str + i));
s = _mm_sub_epi8(s, k);
_mm_storeu_si128((__m128i*) (str + i), s);
}
for(; i<n; i++) str[i] -= key[i%m];
}
отличается от этого?
void decode(const char* key, int m, char* str) {
int i, n = strlen(str);
char keybuf[16] = { 0 };
memcpy(keybuf, key, m);
__m128i k = _mm_loadu_si128((__m128i*)keybuf);
for (i=0; i+16 < n; i += m) {
__m128i s = _mm_loadu_si128((__m128i*)(str+i));
s = _mm_sub_epi8(s,k);
_mm_storeu_si128((__m128i*)(str+i), s);
}
for (; i<n; i++) str[i] -= key[i % m]; }
Без копирования в память тот же код не работает так же. Я компилирую с помощью gcc -msse2. Зачем нужна копия памяти?
for (int i = 0; i + 16 <= n; i += m)
- но это, вероятно, не ваша главная проблема. - person Paul R   schedule 19.01.2017n
, если не исправите это. - person Paul R   schedule 19.01.2017