В настоящее время я пытаюсь наиболее эффективно выполнить на месте умножение массива комплексных чисел (память выровнена так же, как в 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;
};
Я пробовал вручную развернуть цикл, так как мой счетчик цикла finally всегда будетстепень 2, но компилятор уже делает это для меня (я развернул до 32).Я попробовал ссылаться на скаляр const float - думая, что я сохраню один доступ - и это оказалось равным тому, что компилятор уже делал.Я пробовал STL и Transform, результаты которых близки к игре, но все еще хуже.Я также попытался привести к std :: complex и разрешить ему использовать перегруженный оператор для скалярного * complex для умножения, но в конечном итоге это дало те же результаты.
Итак, у кого-нибудь есть идеи?Огромная благодарность за то, что вы уделили время этому размышлению!Целевой платформой является Windows.Я использую Visual Studio 2008. Продукт также не может содержать код GPL!Большое спасибо.