std::mutex 是否足以使所有先前的读写发生在同一线程中的所有后续读写之前?
Is std::mutex enough for making all prior reads-writes happen before following reads-writes all in same thread?
以下函数是否总是在写入 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;
}
或者即使对于这种单线程场景,也始终需要在结束点后解锁互斥锁,或者我们是否必须使用 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 和编译器他们不允许在同步点周围重新排序任何 load/store 以便所有 x 数组操作在任何 y 数组操作之前完成开始。我需要将 reads/writes 的块分开,这样 Kahan-Summation 等算法就不会 被编译器或 CPU 的重新排序[破坏] =21=].
对于单线程应用程序 none 这很重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按该顺序发生。只有当数据在多个线程和内核之间共享时,这些东西才重要。
以下函数是否总是在写入 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;
}
或者即使对于这种单线程场景,也始终需要在结束点后解锁互斥锁,或者我们是否必须使用 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 和编译器他们不允许在同步点周围重新排序任何 load/store 以便所有 x 数组操作在任何 y 数组操作之前完成开始。我需要将 reads/writes 的块分开,这样 Kahan-Summation 等算法就不会 被编译器或 CPU 的重新排序[破坏] =21=].
对于单线程应用程序 none 这很重要,您的程序将按照您执行它们的顺序查看读取和写入,即使它们实际上并未按该顺序发生。只有当数据在多个线程和内核之间共享时,这些东西才重要。