OpenMP и ядра / потоки

Мой процессор - 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 выполняет работу в этом простом случае. Должен сказать, что я новичок в параллельных вычислениях.

Спасибо!

5
задан Community 23 May 2017 в 11:48
поделиться