我正在使用忙等待来同步对关键区域的访问,如下所示:
while (p1_flag != T_ID);
/* begin: critical section */
for (int i=0; i<N; i++) {
...
}
/* end: critical section */
p1_flag++;
p1_flag 是一个全局 volatile 变量,由另一个并发线程更新。事实上,我在一个循环中有两个关键部分,并且我有两个线程(都执行相同的循环)来执行这些关键区域的通勤。例如,关键区域被命名为 A 和 B。
Thread 1 Thread 2
A
B A
A B
B A
A B
B A
B
并行代码的执行速度比串行代码快,但没有我预期的那么多。使用 VTune Amplifier 分析并行程序 我注意到在同步指令(即和标志更新)中花费了大量时间。while(...)
我不确定为什么我在这些“指令”上看到如此大的开销,因为区域 A 与区域 B 完全相同。我最好的猜测是这是由于缓存一致性延迟:我使用的是 Intel i7 Ivy Bridge Machine 和这种微架构解决了 L3 的缓存一致性问题。VTune 还告诉该while (...)
指令正在消耗所有前端带宽,但为什么呢?
为了明确问题:为什么while(...)
和更新标志指令需要这么多执行时间?为什么while(...)
指令会使前端带宽饱和?