Мне нужно будет написать очень простую функцию контрольной суммы, например:
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, которое суммировало бы байты в 128-битных регистрах или, может быть, независимо суммировало бы байты между двумя регистрами без переноса, или и то, и другое.
Есть ли там что-то подобное?
Примечание. Это действительно преждевременная оптимизация, но это весело, так что, черт возьми?
Редактировать: мне все еще нужен способ суммировать все байты в регистре 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];
std::for_each
будет медленнее, чем ручной метод... - person Mike Caron   schedule 13.07.2011