Мне нужно написать очень простую функцию контрольной суммы, например:
char sum(const char * data, const int len)
{
char sum(0);
for (const char * end=data+len ; data<end ; ++data)
sum += *data;
return sum;
}
Это тривиально.Теперь, как я должен оптимизировать это?Во-первых, я, вероятно, должен использовать некоторый std :: for_each с лямбдой или что-то в этом роде:
char sum2(const char * data, const int len)
{
char sum(0);
std::for_each(data, data+len, [&sum](char b){sum+=b;});
return sum;
}
Затем я мог бы использовать несколько потоков / ядер для суммирования кусков, а затем добавить результаты.Я не буду записывать это, и я боюсь, что затраты на создание потоков (или получение их из пула в любом случае), затем нарезку массива, затем отправку всего и т. Д. Не будут очень хорошими, учитывая, что я в основном будувычислять контрольные суммы для маленьких массивов, в основном 10-100 байт, редко до 1000.
Но что я действительно хочу, так это что-то более низкого уровня, некоторые SIMD-вещи, которые суммируют байты в регистрах 128b, или, возможно, суммируют байты независимомежду двумя регистрами без переноса или обоими.
Есть ли там что-нибудь подобное?
Примечание: это действительно преждевременная оптимизация, но это весело, так что, черт возьми?
Редактировать: Мне все еще нужен способ суммировать все байты в регистре SSE, что-то лучше, чем
char ptr[16];
_mm_storeu_si128((__m128i*)ptr, sum);
checksum += ptr[0] + ptr[1] + ptr[2] + ptr[3] + ptr[4] + ptr[5] + ptr[6] + ptr[7]
+ ptr[8] + ptr[9] + ptr[10] + ptr[11] + ptr[12] + ptr[13] + ptr[14] + ptr[15];