From 98131ac83e8bf790a039ddcbb9930146c3a6df08 Mon Sep 17 00:00:00 2001
From: foreman
Date: Mon, 21 Sep 2015 14:46:15 -0400
Subject: [PATCH] P4 to Git Change 1192638 by xcui@merged_opencl_jxcwin on
2015/09/21 14:34:25
SWDEV-17662 - EPR #426715 - for CZ enabled PX system, we need discrete GPU be the first device to do SVM allocation, and the fine grain system capable device do the allocation after discrete GPU.
precheckin:
http://ocltc.amd.com:8111/viewModification.html?modId=58725&personal=true&buildTypeId=&tab=vcsModificationBuilds&show_all_builds=true
code review:
http://ocltc.amd.com/reviews/r/8513/
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/device.hpp#255 edit
... //depot/stg/opencl/drivers/opencl/runtime/platform/context.cpp#36 edit
[ROCm/clr commit: ff9a6c0c58f9ff225ccefbe801905e5268e028a2]
---
projects/clr/rocclr/runtime/device/device.hpp | 5 +++++
.../clr/rocclr/runtime/platform/context.cpp | 20 +++++++++++++++----
2 files changed, 21 insertions(+), 4 deletions(-)
diff --git a/projects/clr/rocclr/runtime/device/device.hpp b/projects/clr/rocclr/runtime/device/device.hpp
index 41a4a9a51d..74d551b895 100644
--- a/projects/clr/rocclr/runtime/device/device.hpp
+++ b/projects/clr/rocclr/runtime/device/device.hpp
@@ -1537,6 +1537,11 @@ public:
CL_DEVICE_SVM_FINE_GRAIN_SYSTEM)) != 0 ? true : false;
}
+ //! check svm FGS support capability.
+ inline bool isFineGrainedSystem() const {
+ return (info().svmCapabilities_ & CL_DEVICE_SVM_FINE_GRAIN_SYSTEM) != 0 ? true : false;
+ }
+
//! Return this device's type.
cl_device_type type() const {
return info().type_ & ~(CL_DEVICE_TYPE_DEFAULT | CL_HSA_ENABLED_AMD
diff --git a/projects/clr/rocclr/runtime/platform/context.cpp b/projects/clr/rocclr/runtime/platform/context.cpp
index f21eea2faf..b097ee7c1b 100644
--- a/projects/clr/rocclr/runtime/platform/context.cpp
+++ b/projects/clr/rocclr/runtime/platform/context.cpp
@@ -40,10 +40,22 @@ Context::Context(
svmAllocDevice_.push_back(device);
}
}
- //make sure the first device is GPU
- if ((svmAllocDevice_.size() > 1)
- && (svmAllocDevice_.front()->type() == CL_DEVICE_TYPE_CPU)) {
- std::swap(svmAllocDevice_.front(), svmAllocDevice_.back());
+ if (svmAllocDevice_.size() > 1) {
+ //make sure the CPU is the last device to do allocation.
+ if ((svmAllocDevice_.front()->type() == CL_DEVICE_TYPE_CPU)) {
+ std::swap(svmAllocDevice_.front(), svmAllocDevice_.back());
+ }
+
+ uint isFirstDeviceFGSEnabled = svmAllocDevice_.front()->isFineGrainedSystem();
+ for (auto& dev : svmAllocDevice_) {
+ //allocation on fine - grained system incapable device first
+ if (isFirstDeviceFGSEnabled && (dev->type() == CL_DEVICE_TYPE_GPU)
+ && (!(dev->isFineGrainedSystem()))) {
+ std::swap(svmAllocDevice_.front(), dev);
+ break;
+ }
+ }
+
}
}