我正在处理一个最初为多核处理器系统开发的传统应用程序。为了利用多核处理,使用了OpenMP和PPL。
现在有一个新的要求,需要在具有多个NUMA节点的系统上运行软件。目标操作系统是Windows 7 x64。
我进行了几次测量,并注意到将应用程序分配给单个NUMA节点并因此浪费一个完整的处理器时,执行时间最佳。应用程序的许多部分执行数据并行算法,例如每个向量的每个元素都以并行方式进行处理,并将结果写入另一个向量,如下面的示例所示。
据我所知,这些算法性能下降的原因是由于从第二个NUMA节点进行的非本地内存访问。所以问题在于如何使应用程序表现更佳。
读取非本地内存的只读访问是否可以通过某种透明的方式加速(例如,通过操作系统将数据从一个节点的本地内存复制到另一个节点的本地内存)?我需要分割问题大小并将输入数据复制到各个NUMA节点,处理完后再将所有NUMA节点的数据组合起来以提高性能吗?
如果是这种情况,那么除了标准容器外,是否有其他选择,因为在分配内存时它们不考虑NUMA。
我进行了几次测量,并注意到将应用程序分配给单个NUMA节点并因此浪费一个完整的处理器时,执行时间最佳。应用程序的许多部分执行数据并行算法,例如每个向量的每个元素都以并行方式进行处理,并将结果写入另一个向量,如下面的示例所示。
std::vector<int> data;
std::vector<int> res;
// init data and res
#pragma omp parallel for
for (int i = 0; i < (int) data.size(); ++i)
{
res[i] = doExtremeComplexStuff(data[i]);
}
据我所知,这些算法性能下降的原因是由于从第二个NUMA节点进行的非本地内存访问。所以问题在于如何使应用程序表现更佳。
读取非本地内存的只读访问是否可以通过某种透明的方式加速(例如,通过操作系统将数据从一个节点的本地内存复制到另一个节点的本地内存)?我需要分割问题大小并将输入数据复制到各个NUMA节点,处理完后再将所有NUMA节点的数据组合起来以提高性能吗?
如果是这种情况,那么除了标准容器外,是否有其他选择,因为在分配内存时它们不考虑NUMA。