Set proper deviceVendor with SYCL
authorPaul Bauer <paul.bauer.q@gmail.com>
Tue, 6 Oct 2020 15:08:18 +0000 (15:08 +0000)
committerAndrey Alekseenko <al42and@gmail.com>
Tue, 6 Oct 2020 15:08:18 +0000 (15:08 +0000)
Change-Id: I7971f681b8e4348f2488b4d353ee187cfa5dba0b

src/gromacs/hardware/device_management.h
src/gromacs/hardware/device_management_common.cpp
src/gromacs/hardware/device_management_ocl.cpp
src/gromacs/hardware/device_management_sycl.cpp

index 6bbf8f9a9901a9ff3e55040d4fbab1fd1741050d..038712ef2827831b7229dead3d39301d2f143fca 100644 (file)
@@ -60,6 +60,7 @@
 #include "gromacs/utility/iserializer.h"
 
 struct DeviceInformation;
+enum class DeviceVendor : int;
 
 /*! \brief Return whether GPUs can be detected.
  *
@@ -109,6 +110,12 @@ bool isDeviceDetectionFunctional(std::string* errorMessage);
  */
 bool canComputeOnDevice();
 
+/*! \brief Returns an DeviceVendor value corresponding to the input OpenCL vendor name.
+ *
+ *  \returns               DeviceVendor value for the input vendor name
+ */
+DeviceVendor getDeviceVendor(const char* vendorName);
+
 /*! \brief Find all GPUs in the system.
  *
  *  Will detect every GPU supported by the device driver in use.
index 024921a5e580153002f68032ce874ffa67b17f87..39b272fcdebaaa08c921d04135e6b66d159abfc4 100644 (file)
@@ -84,6 +84,27 @@ bool canComputeOnDevice()
     return canComputeOnDevice;
 }
 
+DeviceVendor getDeviceVendor(const char* vendorName)
+{
+    if (vendorName)
+    {
+        if (strstr(vendorName, "NVIDIA"))
+        {
+            return DeviceVendor::Nvidia;
+        }
+        else if (strstr(vendorName, "AMD") || strstr(vendorName, "Advanced Micro Devices"))
+        {
+            return DeviceVendor::Amd;
+        }
+        else if (strstr(vendorName, "Intel"))
+        {
+            return DeviceVendor::Intel;
+        }
+    }
+    return DeviceVendor::Unknown;
+}
+
+
 std::vector<std::reference_wrapper<DeviceInformation>>
 getCompatibleDevices(const std::vector<std::unique_ptr<DeviceInformation>>& deviceInfoList)
 {
index 14d211089996c008c774cbc5d4582cfa4222d6b3..3c25f6419999de0ff796402a7d8ec79f2df17948 100644 (file)
 namespace gmx
 {
 
-/*! \brief Returns an DeviceVendor value corresponding to the input OpenCL vendor name.
- *
- *  \returns               DeviceVendor value for the input vendor name
- */
-static DeviceVendor getDeviceVendor(const char* vendorName)
-{
-    if (vendorName)
-    {
-        if (strstr(vendorName, "NVIDIA"))
-        {
-            return DeviceVendor::Nvidia;
-        }
-        else if (strstr(vendorName, "AMD") || strstr(vendorName, "Advanced Micro Devices"))
-        {
-            return DeviceVendor::Amd;
-        }
-        else if (strstr(vendorName, "Intel"))
-        {
-            return DeviceVendor::Intel;
-        }
-    }
-    return DeviceVendor::Unknown;
-}
-
 /*! \brief Return true if executing on compatible OS for AMD OpenCL.
  *
  * This is assumed to be true for OS X version of at least 10.10.4 and
@@ -482,7 +458,7 @@ std::vector<std::unique_ptr<DeviceInformation>> findDevices()
                                     &(deviceInfoList[device_index]->adress_bits), nullptr);
 
                     deviceInfoList[device_index]->deviceVendor =
-                            gmx::getDeviceVendor(deviceInfoList[device_index]->vendorName);
+                            getDeviceVendor(deviceInfoList[device_index]->vendorName);
 
                     clGetDeviceInfo(ocl_device_ids[j], CL_DEVICE_MAX_WORK_ITEM_SIZES, 3 * sizeof(size_t),
                                     &deviceInfoList[device_index]->maxWorkItemSizes, nullptr);
index 3af537ea0d21f6ecc0525304c579cb065d6cfc92..236c2d2ab35827547b2cb82e6d80af73303484cc 100644 (file)
@@ -198,10 +198,11 @@ std::vector<std::unique_ptr<DeviceInformation>> findDevices()
 
         size_t i = deviceInfos.size() - 1;
 
-        deviceInfos[i]->id           = i;
-        deviceInfos[i]->syclDevice   = syclDevice;
-        deviceInfos[i]->status       = checkDevice(i, *deviceInfos[i]);
-        deviceInfos[i]->deviceVendor = DeviceVendor::Unknown;
+        deviceInfos[i]->id         = i;
+        deviceInfos[i]->syclDevice = syclDevice;
+        deviceInfos[i]->status     = checkDevice(i, *deviceInfos[i]);
+        deviceInfos[i]->deviceVendor =
+                getDeviceVendor(syclDevice.get_info<sycl::info::device::vendor>());
     }
     return deviceInfos;
 }