Мой процессор - Core i3 330M с 2 ядрами и 4 потоками. Когда я выполняю команду cat / proc / cpuinfo
в моем терминале, это похоже на то, что у меня 4 CPUS. Когда я использую функцию OpenMP get_omp_num_procs ()
, я также получаю 4.
Теперь у меня есть стандартный векторный класс C ++, я имею в виду класс двойного массива фиксированного размера, который не использует шаблоны выражений. Я тщательно распараллелил все методы своего класса и получил «ожидаемое» ускорение.
Возникает вопрос: могу ли я угадать ожидаемое ускорение в таком простом случае? Например, если я добавлю два вектора без распараллеленных циклов for, я получу некоторое время (с помощью команды времени оболочки). Теперь, если я использую OpenMP, должен ли я получать время, разделенное на 2 или 4, в зависимости от количества ядер / потоков? Подчеркну, что я спрашиваю только об этой конкретной простой проблеме, где нет взаимозависимости в данных, и все является линейным (сложение векторов).
Вот код:
Vector Vector::operator+(const Vector& rhs) const
{
assert(m_size == rhs.m_size);
Vector result(m_size);
#pragma omp parallel for schedule(static)
for (unsigned int i = 0; i < m_size; i++)
result.m_data[i] = m_data[i]+rhs.m_data[i];
return result;
}
Я уже читал этот пост: Отображение потоков OpenMP на физические ядра .
Я надеюсь, что кто-нибудь расскажет мне больше о том, как OpenMP выполняет работу в этом простом случае. Должен сказать, что я новичок в параллельных вычислениях.
Спасибо!