Use mwaitx when busy-waiting signals

Use mwaitx instructions when busy waiting for signals to reduce CPU
energy usage.
This can be disabled by setting HSA_ENABLE_MWAITX=0

Change-Id: Ic207895a491b2bf6dacba47ef0921df3faad5b5a
This commit is contained in:
David Yat Sin
2022-11-15 17:21:59 +00:00
rodzic 0ed1568afc
commit cc48dfdbff
8 zmienionych plików z 59 dodań i 14 usunięć
@@ -42,6 +42,9 @@
#include "core/inc/default_signal.h"
#include "core/util/timer.h"
#include <mwaitxintrin.h>
#define MWAITX_ECX_TIMER_ENABLE 0x2 // BIT(1)
namespace rocr {
namespace core {
@@ -100,6 +103,8 @@ hsa_signal_value_t BusyWaitSignal::WaitRelaxed(hsa_signal_condition_t condition,
timer::duration_from_seconds<timer::fast_clock::duration>(
double(timeout) / double(hsa_freq));
if (g_use_mwaitx) _mm_monitorx(const_cast<int64_t*>(&signal_.value), 0, 0);
while (true) {
if (!IsValid()) return 0;
@@ -132,8 +137,12 @@ hsa_signal_value_t BusyWaitSignal::WaitRelaxed(hsa_signal_condition_t condition,
value = atomic::Load(&signal_.value, std::memory_order_relaxed);
return hsa_signal_value_t(value);
}
if (time - start_time > kMaxElapsed) {
if (time - start_time > kMaxElapsed)
os::uSleep(20);
else if (g_use_mwaitx) {
_mm_mwaitx(0, 60000, MWAITX_ECX_TIMER_ENABLE); // 60000 ~20us on a 1.5Ghz CPU
_mm_monitorx(const_cast<int64_t*>(&signal_.value), 0, 0);
}
}
}