В момента се опитвам да направя най-ефективно умножение на място на масив от комплексни числа (памет, подравнена по същия начин, по който би бил std::complex, но в момента използвам нашия собствен ADT) с масив от скаларни стойности, който е същият размер като масив от комплексни числа.
Алгоритъмът вече е паралелен, т.е. извикващият обект разделя работата на нишки. Това изчисление се извършва върху масиви от стотици милиони - така че може да отнеме известно време, за да завърши. CUDA не е решение за този продукт, въпреки че ми се иска да беше. Имам достъп до усилване и следователно имам известен потенциал да използвам BLAS/uBLAS.
Мисля обаче, че SIMD може да даде много по-добри резултати, но не съм достатъчно запознат с това как да направя това със сложни числа. Кодът, който имам сега, е както следва (не забравяйте, че това е разделено на нишки, които съответстват на броя на ядрата на целевата машина). Целевата машина също е неизвестна. Така че общият подход вероятно е най-добрият.
void cmult_scalar_inplace(fcomplex *values, const int start, const int end, const float *scalar)
{
for (register int idx = start; idx < end; ++idx)
{
values[idx].real *= scalar[idx];
values[idx].imag *= scalar[idx];
}
}
fcomplex се дефинира, както следва:
struct fcomplex
{
float real;
float imag;
};
Опитах ръчно да развия цикъла, тъй като броят на окончателните ми цикли винаги ще бъде степен 2, но компилаторът вече прави това вместо мен (развих до 32). Опитах const float препратка към скалара - мислейки, че ще спестя един достъп - и това се оказа равно на това, което компилаторът вече правеше. Пробвах STL и transform, които играха близки резултати, но все още по-лоши. Опитах също да прехвърля към std::complex и да му позволя да използва претоварения оператор за scalar * complex за умножението, но това в крайна сметка доведе до същите резултати.
И така, някой с идеи? Изказваме голяма благодарност за отделеното време при обмислянето на това! Целевата платформа е Windows. Използвам Visual Studio 2008. Продуктът не може да съдържа и GPL код! Много благодаря.