带有静态变量的OpenMP线程亲和力



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)的速度总是很慢。当然,这不再是一个简单的原子写作,而单个静音只会使您回到起点。我怀疑这是自己拥有的代码土地。

不应忘记的简单情况:如果对象在线程之间传递,那么可能会访问非本地对象的线程。

最新更新