Ще трябва да кодирам много елементарна функция за контролна сума, нещо като:
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];
std::for_each
ще бъде по-бавна от ръчния метод... - person Mike Caron   schedule 13.07.2011