Uniprocessor Ordering is trivially satisfied when all
operations execute sequentially in program order. Thus,
Uniprocessor Ordering can be dynamically verified by
comparing all load results obtained during the original
out-of-order execution to the load results obtained during a subsequent sequential execution of the same program [8, 5, 3]. Because instructions commit in program
order, results of sequential execution can be obtained by
replaying all memory operations when they commit.
Replay of memory accesses occurs during the verification stage, which we add to the pipeline before the
retirement stage. During replay, stores are still speculative and thus must not modify architectural state. Instead
they write to a dedicated verification cache (VC).
Replayed loads first access the VC and, on a miss,
access the highest level of the cache hierarchy (bypassing the write buffer). The load value from the original
execution resides in a separate structure, but could also
reside in the register file. In case of a mismatch between
the replayed load value and the original load value, a
Uniprocessor Ordering violation is signalled. Such a
violation can be resolved by a simple pipeline flush,
because all operations are still speculative prior to verification. Multiple operations can be replayed in parallel,
independent of register dependencies, as long as they do
not access the same address.
Uniprocessor Ordering is trivially satisfied when all
operations execute sequentially in program order. Thus,
Uniprocessor Ordering can be dynamically verified by
comparing all load results obtained during the original
out-of-order execution to the load results obtained during a subsequent sequential execution of the same program [8, 5, 3]. Because instructions commit in program
order, results of sequential execution can be obtained by
replaying all memory operations when they commit.
Replay of memory accesses occurs during the verification stage, which we add to the pipeline before the
retirement stage. During replay, stores are still speculative and thus must not modify architectural state. Instead
they write to a dedicated verification cache (VC).
Replayed loads first access the VC and, on a miss,
access the highest level of the cache hierarchy (bypassing the write buffer). The load value from the original
execution resides in a separate structure, but could also
reside in the register file. In case of a mismatch between
the replayed load value and the original load value, a
Uniprocessor Ordering violation is signalled. Such a
violation can be resolved by a simple pipeline flush,
because all operations are still speculative prior to verification. Multiple operations can be replayed in parallel,
independent of register dependencies, as long as they do
not access the same address.
การแปล กรุณารอสักครู่..
