在写入y [100]之前,跟随函数是否始终写入x [100]?
void fenceTest(float * x, float * y /* this could be x too*/)
{
x[100]=3.14f; // maybe atomic write
x[200]=3.14f;
myMutex.lock();
myMutex.unlock();
y[100]=2.72f; // maybe atomic write too
y[200]=2.72f;
}
或mutex需要在终点之后解锁,即使对于这个单线程场景也是如此,或者我们是否必须使用atomic_thread_fence?
void fenceTest(float * x, float * y)
{
x[100]=3.14f; // maybe atomic too
x[200]=3.14f;
std::atomic_thread_fence(std::memory_order_relaxed);
y[100]=2.72f; // maybe atomic write too
y[200]=2.72f;
}
我的目的是告诉CPU和编译器他们不允许重新排序同步点周围的任何加载/存储,以便在任何y数组操作开始之前完成所有x-array操作。我需要分离读/写块,以便 Kahan-Summation 等算法不会被编译器或CPU的重新排序打破。< / p>
答案 0 :(得分:2)
对于单线程应用程序,这一点都不重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按此顺序发生。只有当数据在多个线程和核心之间共享时,这一点才有意义。