Implement async scratch reclaim

For devices where the CP FW supports asynchronous scratch reclaim, ROCr
is able to claw-back scratch memory that was assigned to an AQL queue.
With that ability, ROCr does not have to rely on using USO
(use-scratch-once) when assigning large amounts of memory to a queue.
If we reach a situation where we are running low on device memory, ROCr
will attempt to claw-back the scratch memory.

Change-Id: Iddf8ec84e37ab8b9fdc58bafbe2b61fe2acb6eb7
Dieser Commit ist enthalten in:
David Yat Sin
2023-11-15 18:29:18 +00:00
Ursprung 64070a9acc
Commit dca8f3a21d
12 geänderte Dateien mit 231 neuen und 11 gelöschten Zeilen
+24 -2
Datei anzeigen
@@ -64,7 +64,8 @@ class Flag {
static_assert(XNACK_DISABLE == 0, "XNACK_REQUEST enum values improperly changed.");
static_assert(XNACK_ENABLE == 1, "XNACK_REQUEST enum values improperly changed.");
// Lift limit for 2.10 release RCCL workaround.
// Lift limit for 2.10 release RCCL workaround. This limit is not used when asynchronous scratch
// reclaim is supported
const size_t DEFAULT_SCRATCH_SINGLE_LIMIT = 146800640; // small_limit >> 2;
explicit Flag() { Refresh(); }
@@ -120,11 +121,26 @@ class Flag {
// memory
if (os::IsEnvVarSet("HSA_SCRATCH_SINGLE_LIMIT")) {
var = os::GetEnvVar("HSA_SCRATCH_SINGLE_LIMIT");
scratch_single_limit_ = atoi(var.c_str());
char* end;
scratch_single_limit_ = strtoul(var.c_str(), &end, 10);
} else {
scratch_single_limit_ = DEFAULT_SCRATCH_SINGLE_LIMIT;
}
// On GPUs that support asynchronous scratch reclaim
// Scratch memory sizes > HSA_SCRATCH_SINGLE_LIMIT_ASYNC will trigger a use-once scheme
if (os::IsEnvVarSet("HSA_SCRATCH_SINGLE_LIMIT_ASYNC")) {
var = os::GetEnvVar("HSA_SCRATCH_SINGLE_LIMIT_ASYNC");
char* end;
scratch_single_limit_async_ = strtoul(var.c_str(), &end, 10);
} else {
scratch_single_limit_async_ = 0; // DEFAULT_SCRATCH_SINGLE_LIMIT_ASYNC_PER_XCC;
}
// On GPUs that support asynchronous scratch reclaim this can be used to disable this feature.
var = os::GetEnvVar("HSA_ENABLE_SCRATCH_ASYNC_RECLAIM");
enable_scratch_async_reclaim_ = (var == "0") ? false : true;
tools_lib_names_ = os::GetEnvVar("HSA_TOOLS_LIB");
var = os::GetEnvVar("HSA_TOOLS_REPORT_LOAD_FAILURE");
@@ -252,6 +268,10 @@ class Flag {
size_t scratch_single_limit() const { return scratch_single_limit_; }
bool enable_scratch_async_reclaim() const { return enable_scratch_async_reclaim_; }
size_t scratch_single_limit_async() const { return scratch_single_limit_async_; }
std::string tools_lib_names() const { return tools_lib_names_; }
bool disable_image() const { return disable_image_; }
@@ -330,6 +350,8 @@ class Flag {
size_t scratch_mem_size_;
size_t scratch_single_limit_;
size_t scratch_single_limit_async_;
bool enable_scratch_async_reclaim_;
std::string tools_lib_names_;
std::string svm_profile_;