我有一个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节点之间)。据我了解,由于此代码包含一个静态变量,因此它在所有类实例之间均有效地共享,因此在线程创建时,我将无法控制放置静态变量的内存位置。它是否正确?但是我假设其他非静态变量将位于靠近正在使用的套接字的内存位置?谢谢
答案 0 :(得分:1)
您必须假设线程堆栈,线程绑定的malloc和线程本地存储将分配给线程的“本地”内存-因此,至少应在创建它们的线程上优化所有自动变量或新变量,尽管我不知道哪些编译器支持这种分配模型;但是正如您所说,静态非常量数据只能存在于一个位置。我猜想编译器是否可以识别const段或构造的const段,那么在构造之后,它们可以按区域复制,然后映射到相同的逻辑地址吗?再次不知道编译器是否自动执行此操作。
非常量静态变量将很麻烦。大概这些静态信息有助于执行某种线程同步。如果它们包含经常读取且很少写入的标志,则为了获得最佳性能,编写者最好写入多个已注册的副本(每个区域一个),并且每个线程都使用指向适当区域副本的线程本地指针,超过一半(或3/4)的阅读器总是很慢。当然,这不再是简单的原子写入,而单个互斥锁只会使您回到开始的位置。我怀疑这是您自己编写的代码域。
不应该忘记的简单情况:如果在线程之间传递对象,则潜在地线程可能正在访问非本地对象。