Я пишу тот же код на 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 эффективно векторизуется (без прагмы, производительность хуже, и во время компиляции он векторизуется)
РЕДАКТИРОВАТЬ:
- Я компилирую, используя:
Подробнее здесь: https://stackoverflow.com/questions/797 ... -vs-python
Мобильная версия