我的 CPU 是 Core i3 330M,有 2 个内核和 4 个线程。当我在终端中执行命令 cat/proc/cpuinfo
时,就像我有 4 个 CPU。当我使用 OpenMP 函数时get_omp_num_procs()
,我也得到 4。
现在我有一个标准的 C++ 向量类,我的意思是一个不使用表达式模板的固定大小的双数组类。我已经仔细地并行化了我班级的所有方法,并且得到了“预期的”加速。
问题是:在这种简单的情况下,我能猜出预期的加速吗?例如,如果我在没有并行化 for 循环的情况下添加两个向量,我会得到一些时间(使用 shell time 命令)。现在,如果我使用 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 thread mapping to physical cores。
我希望有人能告诉我更多关于 OpenMP 如何在这个简单的案例中完成工作的信息。我应该说我是并行计算的初学者。
谢谢!