Скалярный продукт C++ против PythonC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Скалярный продукт C++ против Python

Сообщение Anonymous »

Мне нужна ваша помощь. Я пишу код, который должен выполнять скалярное произведение между вектором b и матрицей C, где точка выполняется между b и каждой строкой C. В numpy это можно легко сделать с помощью numpy.dot. Для b в R^jmax и C в R^{kmax*jmax} с jmax=700 и kmax=100000 для numpy.dot требуется около 20 миллисекунд.
Я пишу тот же код на C++, но производительность намного хуже, где при тех же размерах требуемое время составляет 70 миллисекунд.
Мой код на C++ следующий:

Код: Выделить всё

size_t jmax = 700;
size_t kmax = 100000;
vector C(jmax+1);
vector b(N);  // with N >> jmax

//computation of b and C omitted

double* eps_ptr = C[jmax].ptr;

for (size_t j(0); j < jmax; ++j) {

double* c_ptr = C[j].ptr;
double bj = b[jmax - j];

#pragma loop(ivdep)
for (size_t k(0); k < kmax; ++k) {

eps_ptr[k] += bj * c_ptr[k];
}
}
Некоторые комментарии:
  • OV — это особая структура, представляющая собой оптимизированный вектор, который мне не следует трогать. Объект OV имеет метод OV.ptr, который выводит указатель на первый элемент.
  • Я помещаю цикл for k внутрь для обеспечения непрерывности памяти.
  • Хотя OV eps не принадлежит C «семантически», я помещаю его туда для непрерывности памяти.
  • Внутренний цикл for эффективно векторизуется (без прагмы, производительность хуже, и во время компиляции он векторизуется)
Я хочу улучшить производительность моего кода C++, чтобы быть конкурентоспособным по сравнению с numpy.dot. Этот фрагмент кода принадлежит огромной функции F: в других частях F C++ имеет гораздо лучшую производительность, чем реализация F на Python. Код, который я опубликовал, является единственным узким местом в C++, обнаруженным при отладке и профилировании.
РЕДАКТИРОВАТЬ:
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»