带有静态变量的OpenMP线程亲和力
OpenMP thread affinities with static variables
i具有一个C 类C,其中包含一些代码,包括一个静态变量,该变量只能读取,也许是constexpr静态函数。例如:
template<std::size_t T>
class C {
public:
//some functions
void func1();
void func2()
static constexpr std::size_t sfunc1(){ return T; }
private:
std::size_t var1;
std::array<std::size_t,10000> array1;
static int svar1;
}
这个想法是使用OpenMP 4.5的线程亲和力机制来控制执行此类各种实例的套接字(NUMA架构)(因此,还将其放置在靠近套接字的内存位置中以避免使用互连在numa节点之间)。我的理解是,由于此代码包含一个静态变量,因此在所有类实例之间有效共享,因此我无法控制将静态变量(在线程创建时)放置的内存位置。它是否正确?但是我认为其他非静态变量将位于靠近所使用插座的内存位置?谢谢
您必须假设线程堆栈,线程绑定的malloc和线程本地存储将分配给线程的" local"内存 - 因此至少应优化任何自动或新变量在它们创建的线程上,尽管我不知道哪些编译器支持这种分配模型。但是,正如您所说,静态非const数据只能存在于一个位置。我猜编译器是否识别const段或构造的const段,那么在构造之后,每个区域都可以重复,然后映射到相同的逻辑地址?再次不知道编译器是否正在自动执行此操作。
非const静态会很麻烦。大概这些静态有助于执行某种线程同步。如果它们包含经常读取且很少书写的标志,则为了获得最佳性能,作者可以写入许多注册副本(每个区域一个),并且每个线程使用线程 - 本地指针到适当的区域副本,读者总是一半(或3/4)的速度总是很慢。当然,这不再是一个简单的原子写作,而单个静音只会使您回到起点。我怀疑这是自己拥有的代码土地。
不应忘记的简单情况:如果对象在线程之间传递,那么可能会访问非本地对象的线程。
相关文章:
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 充分私有化 OpenMP 线程中的数据
- OpenMP 线程创建
- 在 NUMA 节点之间散布 OpenMP 线程
- 如何实时监控不同的 OpenMP 线程?
- 带有静态变量的OpenMP线程亲和力
- 启用从程序内部取消 openmp 线程
- 为函数创建OpenMP线程
- openmp:线程数量的增加会降低性能
- C++和OpenMP——线程的执行时间大不相同
- OpenMP线程之间的矢量填充
- OpenMP线程、数据访问延迟和STL数据容器
- 一般 openMP - 线程速度不同
- 如何使GNU GCC类似地优化OpenMP线程
- 如何在 OpenMP 线程专用指令中使用对象的直接初始化
- 在 OpenMP 线程之间进行通信
- 如何通过循环将 OpenMP 线程拆分为子组
- 在同一个cpu内核上执行的OpenMP线程
- OpenMP线程多于工作对性能的影响是什么?
- 如何在给定的openmp线程结束时退出程序