Handle multiple GNA devices and modes HW/SW (#2720)
authorKrzysztof Bruniecki <krzysztof.bruniecki@intel.com>
Tue, 3 Nov 2020 07:49:09 +0000 (08:49 +0100)
committerGitHub <noreply@github.com>
Tue, 3 Nov 2020 07:49:09 +0000 (10:49 +0300)
* Introduce Gna2DeviceGetCount

* Check for the number of GNA devices

* Add Gna2DeviceGetCount() mock

inference-engine/src/gna_plugin/gna_device.cpp
inference-engine/src/gna_plugin/gna_device.hpp
inference-engine/src/gna_plugin/gna_plugin_query_api.cpp
inference-engine/tests/unit/gna/gna_api_stub.cpp
inference-engine/tests_deprecated/unit/engines/gna/gna_api_stub.cpp
inference-engine/tests_deprecated/unit/engines/gna/gna_mock_api.hpp

index 7cd9fc2..963a1c3 100644 (file)
@@ -132,6 +132,22 @@ uint32_t GNADeviceHelper::createRequestConfig(const uint32_t model_id) {
     return reqConfId;
 }
 
+uint32_t GNADeviceHelper::getNumberOfGnaDevices() {
+    std::unique_lock<std::mutex> lockGnaCalls{ acrossPluginsSync };
+    uint32_t numberOfGnaDevices = 0;
+    auto status = Gna2DeviceGetCount(&numberOfGnaDevices);
+    checkGna2Status(status);
+    return numberOfGnaDevices;
+}
+
+uint32_t GNADeviceHelper::selectGnaDevice() {
+    const auto deviceCount = getNumberOfGnaDevices();
+    if (deviceCount != 1) {
+        THROW_GNA_EXCEPTION << "Unsupported number of GNA devices detected = " << deviceCount;
+    }
+    return 0;
+}
+
 void GNADeviceHelper::checkGna2Status(Gna2Status status, const Gna2Model& gnaModel) {
     if (!Gna2StatusIsSuccessful(status)) {
         std::vector<char> gna2StatusBuffer(1024);
index d067ce9..596ba8f 100644 (file)
@@ -69,12 +69,13 @@ public:
                             bool isPerformanceMeasuring = false) :
                                     isPerformanceMeasuring(isPerformanceMeasuring) {
 #else
-     explicit GNADeviceHelper(Gna2DeviceVersion gna2HwConsistency = Gna2DeviceVersionSoftwareEmulation,
+    explicit GNADeviceHelper(Gna2DeviceVersion gna2HwConsistency = Gna2DeviceVersionSoftwareEmulation,
          uint8_t lib_async_n_threads = 1,
          bool use_openmp = false,
          bool isPerformanceMeasuring = false) :
          gna2HwConsistency(gna2HwConsistency),
-         isPerformanceMeasuring(isPerformanceMeasuring) {
+         isPerformanceMeasuring(isPerformanceMeasuring),
+         nGnaDeviceIndex{selectGnaDevice()} {
 #endif
         open(lib_async_n_threads);
         initGnaPerfCounters();
@@ -116,6 +117,8 @@ public:
 #endif
     void releaseModel(const uint32_t model_id);
     uint32_t createRequestConfig(const uint32_t model_id);
+    static uint32_t getNumberOfGnaDevices();
+    static uint32_t selectGnaDevice();
     bool hasGnaHw() const {
         return Gna2DeviceVersionSoftwareEmulation != detectedGnaDevVersion;
     }
index c078675..53e573d 100644 (file)
@@ -36,8 +36,8 @@ Parameter GNAPlugin::GetMetric(const std::string& name, const std::map<std::stri
             }
 
             if (!options.count(KEY_DEVICE_ID)) {
-                if (availableDevices.size() == 1) {
-                    return availableDevices[0];
+                if (availableDevices.size() == 1 || availableDevices.size() == 2) {
+                    return availableDevices.back(); // detection order is GNA_SW, GNA_HW
                 } else {
                     THROW_GNA_EXCEPTION << "KEY_DEVICE_ID not set in request for FULL_DEVICE_NAME";
                 }
index d109f49..fb35cf8 100644 (file)
@@ -60,6 +60,14 @@ GNA2_API Gna2Status Gna2DeviceClose(
     return Gna2StatusSuccess;
 }
 
+GNA2_API Gna2Status Gna2DeviceGetCount(
+    uint32_t* numberOfDevices) {
+    if (numberOfDevices != nullptr) {
+        *numberOfDevices = 1;
+    }
+    return Gna2StatusSuccess;
+}
+
 GNA2_API enum Gna2Status Gna2MemoryFree(
     void * memory) {
     return Gna2StatusSuccess;
index be48e98..1502f8f 100644 (file)
@@ -69,6 +69,14 @@ GNA2_API Gna2Status Gna2DeviceClose(
     return Gna2StatusSuccess;
 }
 
+GNA2_API Gna2Status Gna2DeviceGetCount(
+    uint32_t * numberOfDevices) {
+    if (numberOfDevices != nullptr) {
+        *numberOfDevices = 1;
+    }
+    return Gna2StatusSuccess;
+}
+
 GNA2_API enum Gna2Status Gna2MemoryFree(
     void * memory) {
     if (current != nullptr) {
index f93effc..7b3fb2d 100644 (file)
@@ -102,6 +102,9 @@ class GNACppApi {
     MOCK_METHOD1(Gna2DeviceClose, Gna2Status (
         uint32_t deviceIndex));
 
+    MOCK_METHOD1(Gna2DeviceGetCount, Gna2Status (
+        uint32_t * numberOfDevices));
+
     MOCK_METHOD1(Gna2MemoryFree, Gna2Status (
         void * memory));