From 68c299486b976cee75155177b51d8e39647285f8 Mon Sep 17 00:00:00 2001
From: foreman
Date: Tue, 20 Mar 2018 17:13:51 -0400
Subject: [PATCH] P4 to Git Change 1529710 by wchau@wchau_OCL_boltzmann on
2018/03/20 17:05:04
SWDEV-145760 - OCL on ROCm Support for respecting target's xnack setting (subtask of SWDEV-134107)
Affected files ...
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palcompiler.cpp#21 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldefs.hpp#34 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/paldevice.cpp#77 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/pal/palprogram.cpp#58 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/roccompiler.cpp#41 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdefs.hpp#16 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocdevice.cpp#84 edit
... //depot/stg/opencl/drivers/opencl/runtime/device/rocm/rocprogram.cpp#80 edit
---
rocclr/runtime/device/pal/palcompiler.cpp | 5 ++
rocclr/runtime/device/pal/paldefs.hpp | 71 +++++++++++-----------
rocclr/runtime/device/pal/paldevice.cpp | 17 +++---
rocclr/runtime/device/pal/palprogram.cpp | 5 ++
rocclr/runtime/device/rocm/roccompiler.cpp | 5 ++
rocclr/runtime/device/rocm/rocdefs.hpp | 29 ++++-----
rocclr/runtime/device/rocm/rocdevice.cpp | 7 +++
rocclr/runtime/device/rocm/rocprogram.cpp | 7 ++-
8 files changed, 89 insertions(+), 57 deletions(-)
diff --git a/rocclr/runtime/device/pal/palcompiler.cpp b/rocclr/runtime/device/pal/palcompiler.cpp
index be9348ad70..7695387278 100644
--- a/rocclr/runtime/device/pal/palcompiler.cpp
+++ b/rocclr/runtime/device/pal/palcompiler.cpp
@@ -253,6 +253,11 @@ bool LightningProgram::compileImpl(const std::string& sourceCode,
mCPU << " -mcpu=gfx" << dev().hwInfo()->gfxipVersion_;
driverOptions.append(mCPU.str());
+ // Set xnack option if needed
+ if (dev().hwInfo()->xnackEnabled_) {
+ driverOptions.append(" -mxnack");
+ }
+
driverOptions.append(options->llvmOptions);
driverOptions.append(hsailOptions(options));
diff --git a/rocclr/runtime/device/pal/paldefs.hpp b/rocclr/runtime/device/pal/paldefs.hpp
index 06740582cf..d98f4d5000 100644
--- a/rocclr/runtime/device/pal/paldefs.hpp
+++ b/rocclr/runtime/device/pal/paldefs.hpp
@@ -117,58 +117,59 @@ struct AMDDeviceInfo {
uint localMemSizePerCU_; //!< Local memory size per CU
uint localMemBanks_; //!< Number of banks of local memory
uint gfxipVersion_; //!< The core engine GFXIP version
+ bool xnackEnabled_; //!< Enable XNACK feature
};
static const AMDDeviceInfo DeviceInfo[] = {
- /* Unknown */ {"", "unknown", 4, 16, 1, 256, 64 * Ki, 32, 0},
- /* Tahiti */ {"", "tahiti", 4, 16, 1, 256, 64 * Ki, 32, 600},
- /* Pitcairn */ {"", "pitcairn", 4, 16, 1, 256, 64 * Ki, 32, 600},
- /* Capeverde */ {"", "bonaire", 4, 16, 1, 256, 64 * Ki, 32, 700},
- /* Oland */ {"", "oland", 4, 16, 1, 256, 64 * Ki, 32, 600},
- /* Hainan */ {"", "hainan", 4, 16, 1, 256, 64 * Ki, 32, 600},
+ /* Unknown */ {"", "unknown", 4, 16, 1, 256, 64 * Ki, 32, 0, false},
+ /* Tahiti */ {"", "tahiti", 4, 16, 1, 256, 64 * Ki, 32, 600, false},
+ /* Pitcairn */ {"", "pitcairn", 4, 16, 1, 256, 64 * Ki, 32, 600, false},
+ /* Capeverde */ {"", "bonaire", 4, 16, 1, 256, 64 * Ki, 32, 700, false},
+ /* Oland */ {"", "oland", 4, 16, 1, 256, 64 * Ki, 32, 600, false},
+ /* Hainan */ {"", "hainan", 4, 16, 1, 256, 64 * Ki, 32, 600, false},
- /* Bonaire */ {"Bonaire", "bonaire", 4, 16, 1, 256, 64 * Ki, 32, 700},
- /* Hawaii */ {"Hawaii", "hawaii", 4, 16, 1, 256, 64 * Ki, 32, 701},
- /* Hawaii */ {"", "grenada", 4, 16, 1, 256, 64 * Ki, 32, 701},
- /* Hawaii */ {"", "maui", 4, 16, 1, 256, 64 * Ki, 32, 701},
+ /* Bonaire */ {"Bonaire", "bonaire", 4, 16, 1, 256, 64 * Ki, 32, 700, false},
+ /* Hawaii */ {"Hawaii", "hawaii", 4, 16, 1, 256, 64 * Ki, 32, 701, false},
+ /* Hawaii */ {"", "grenada", 4, 16, 1, 256, 64 * Ki, 32, 701, false},
+ /* Hawaii */ {"", "maui", 4, 16, 1, 256, 64 * Ki, 32, 701, false},
- /* Kalindi */ {"Kalindi", "kalindi", 4, 16, 1, 256, 64 * Ki, 32, 702},
- /* Godavari */ {"Mullins", "mullins", 4, 16, 1, 256, 64 * Ki, 32, 702},
- /* Spectre */ {"Spectre", "spectre", 4, 16, 1, 256, 64 * Ki, 32, 701},
- /* Spooky */ {"Spooky", "spooky", 4, 16, 1, 256, 64 * Ki, 32, 701},
+ /* Kalindi */ {"Kalindi", "kalindi", 4, 16, 1, 256, 64 * Ki, 32, 702, false},
+ /* Godavari */ {"Mullins", "mullins", 4, 16, 1, 256, 64 * Ki, 32, 702, false},
+ /* Spectre */ {"Spectre", "spectre", 4, 16, 1, 256, 64 * Ki, 32, 701, false},
+ /* Spooky */ {"Spooky", "spooky", 4, 16, 1, 256, 64 * Ki, 32, 701, false},
- /* Carrizo */ {"Carrizo", "carrizo", 4, 16, 1, 256, 64 * Ki, 32, 801},
- /* Bristol */ {"Bristol Ridge", "carrizo", 4, 16, 1, 256, 64 * Ki, 32, 801},
- /* Stoney */ {"Stoney", "stoney", 4, 16, 1, 256, 64 * Ki, 32, 810},
+ /* Carrizo */ {"Carrizo", "carrizo", 4, 16, 1, 256, 64 * Ki, 32, 801, false},
+ /* Bristol */ {"Bristol Ridge", "carrizo", 4, 16, 1, 256, 64 * Ki, 32, 801, false},
+ /* Stoney */ {"Stoney", "stoney", 4, 16, 1, 256, 64 * Ki, 32, 810, false},
- /* Iceland */ {"Iceland", "iceland", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(802, 800)},
- /* Tonga */ {"Tonga", "tonga", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(802, 800)},
- /* Fiji */ {"Fiji", "fiji", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804)},
- /* Ellesmere */ {"Ellesmere", "ellesmere", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804)},
- /* Baffin */ {"Baffin", "baffin", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804)},
- /* Lexa */ {"gfx803", "gfx803", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804)},
+ /* Iceland */ {"Iceland", "iceland", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(802, 800), false},
+ /* Tonga */ {"Tonga", "tonga", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(802, 800), false},
+ /* Fiji */ {"Fiji", "fiji", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804), false},
+ /* Ellesmere */ {"Ellesmere", "ellesmere", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804), false},
+ /* Baffin */ {"Baffin", "baffin", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804), false},
+ /* Lexa */ {"gfx803", "gfx803", 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(803, 804), false},
};
// Ordering as per AsicRevision# in //depot/stg/pal/inc/core/palDevice.h and
// http://confluence.amd.com/pages/viewpage.action?spaceKey=ASLC&title=AMDGPU+Target+Names
static const AMDDeviceInfo Gfx9PlusSubDeviceInfo[] = {
- /* Vega10 */{"gfx900", "gfx900", 4, 16, 1, 256, 64 * Ki, 32, 900},
+ /* Vega10 */{"gfx900", "gfx900", 4, 16, 1, 256, 64 * Ki, 32, 900, false},
/* Vega10 XNACK */{ LIGHTNING_SWITCH("gfx900","gfx901"), LIGHTNING_SWITCH("gfx900","gfx901"),
- 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(900, 901)},
- /* Vega12 */{"gfx904", "gfx904", 4, 16, 1, 256, 64 * Ki, 32, 904},
+ 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(900, 901), true},
+ /* Vega12 */{"gfx904", "gfx904", 4, 16, 1, 256, 64 * Ki, 32, 904, false},
/* Vega12 XNACK */{ LIGHTNING_SWITCH("gfx904","gfx905"), LIGHTNING_SWITCH("gfx904","gfx905"),
- 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(904, 905)},
- /* Vega20 */{"gfx906", "gfx906", 4, 16, 1, 256, 64 * Ki, 32, 906},
+ 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(904, 905), true},
+ /* Vega20 */{"gfx906", "gfx906", 4, 16, 1, 256, 64 * Ki, 32, 906, false},
/* Vega20 XNACK */{ LIGHTNING_SWITCH("gfx906","gfx907"), LIGHTNING_SWITCH("gfx906","gfx907"),
- 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(906, 907)},
- /* Raven */{"gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 902},
+ 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(906, 907), true},
+ /* Raven */{"gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 902, false},
/* Raven XNACK */{ LIGHTNING_SWITCH("gfx902","gfx903"), LIGHTNING_SWITCH("gfx902","gfx903"),
- 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(902, 903)},
- /* Raven2 */{"gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 902},
+ 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(902, 903), true},
+ /* Raven2 */{"gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 902, false},
/* Raven2 XNACK */{ LIGHTNING_SWITCH("gfx902","gfx903"), LIGHTNING_SWITCH("gfx902","gfx903"),
- 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(902, 903)},
- /* Navi10 */{ "", "", 4, 16, 1, 256, 64 * Ki, 32, 1000},
- /* Navi10 XNACK */{ "", "", 4, 16, 1, 256, 64 * Ki, 32, 1001},
+ 4, 16, 1, 256, 64 * Ki, 32, LIGHTNING_SWITCH(902, 903), true},
+ /* Navi10 */{ "", "", 4, 16, 1, 256, 64 * Ki, 32, 1000, false},
+ /* Navi10 XNACK */{ "", "", 4, 16, 1, 256, 64 * Ki, 32, 1001, true},
};
// Supported OpenCL versions
diff --git a/rocclr/runtime/device/pal/paldevice.cpp b/rocclr/runtime/device/pal/paldevice.cpp
index 1a71e3adf4..419a455952 100644
--- a/rocclr/runtime/device/pal/paldevice.cpp
+++ b/rocclr/runtime/device/pal/paldevice.cpp
@@ -144,30 +144,26 @@ bool NullDevice::init() {
}
Pal::AsicRevision revision = Pal::AsicRevision::Unknown;
- uint xNACKSupported = 0;
+ uint xNACKSupported = pal::Gfx9PlusSubDeviceInfo[id].xnackEnabled_ ? 1 : 0;
+
switch (pal::Gfx9PlusSubDeviceInfo[id].gfxipVersion_) {
case 901:
- xNACKSupported = 1;
case 900:
revision = Pal::AsicRevision::Vega10;
break;
case 903:
- xNACKSupported = 1;
case 902:
revision = Pal::AsicRevision::Raven;
break;
case 905:
- xNACKSupported = 1;
case 904:
revision = Pal::AsicRevision::Vega12;
break;
case 907:
- xNACKSupported = 1;
case 906:
revision = Pal::AsicRevision::Vega20;
break;
case 1001:
- xNACKSupported = 1;
case 1000:
revision = Pal::AsicRevision::Navi10;
break;
@@ -437,7 +433,11 @@ void NullDevice::fillDeviceInfo(const Pal::DeviceProperties& palProp,
const static char* bristol = "Bristol Ridge";
::strcpy(info_.name_, bristol);
} else {
- ::strcpy(info_.name_, hwInfo()->targetName_);
+ if (IS_LIGHTNING && hwInfo()->xnackEnabled_) {
+ ::snprintf(info_.name_, sizeof(info_.name_) - 1, "%s-xnack", hwInfo()->targetName_);
+ } else {
+ ::strcpy(info_.name_, hwInfo()->targetName_);
+ }
}
::strcpy(info_.vendor_, "Advanced Micro Devices, Inc.");
::snprintf(info_.driverVersion_, sizeof(info_.driverVersion_) - 1, AMD_BUILD_STRING " (PAL%s)",
@@ -916,6 +916,9 @@ bool Device::create(Pal::IDevice* device) {
// with dash as delimiter to be compatible with Windows directory name
std::ostringstream cacheTarget;
cacheTarget << "AMD-AMDGPU-" << gfxipMajor << "-" << gfxipMinor << "-" << gfxipStepping;
+ if (isXNACKSupported) {
+ cacheTarget << "-xnack";
+ }
amd::CacheCompilation* compObj = new amd::CacheCompilation(
cacheTarget.str(), "_pal", OCL_CODE_CACHE_ENABLE, OCL_CODE_CACHE_RESET);
diff --git a/rocclr/runtime/device/pal/palprogram.cpp b/rocclr/runtime/device/pal/palprogram.cpp
index 179b990bf2..27a31bf937 100644
--- a/rocclr/runtime/device/pal/palprogram.cpp
+++ b/rocclr/runtime/device/pal/palprogram.cpp
@@ -1437,6 +1437,11 @@ bool LightningProgram::linkImpl(amd::option::Options* options) {
mCPU << " -mcpu=gfx" << dev().hwInfo()->gfxipVersion_;
codegenOptions.append(mCPU.str());
+ // Set xnack option if needed
+ if (dev().hwInfo()->xnackEnabled_) {
+ codegenOptions.append(" -mxnack");
+ }
+
// Set the -O#
std::ostringstream optLevel;
optLevel << "-O" << options->oVariables->OptLevel;
diff --git a/rocclr/runtime/device/rocm/roccompiler.cpp b/rocclr/runtime/device/rocm/roccompiler.cpp
index e0a28a1455..cc0335cfee 100644
--- a/rocclr/runtime/device/rocm/roccompiler.cpp
+++ b/rocclr/runtime/device/rocm/roccompiler.cpp
@@ -219,6 +219,11 @@ bool LightningProgram::compileImpl(const std::string& sourceCode,
driverOptions.append(" -mcpu=");
driverOptions.append(dev().deviceInfo().machineTarget_);
+ // Set xnack option if needed
+ if (dev().deviceInfo().xnackEnabled_) {
+ driverOptions.append(" -mxnack");
+ }
+
driverOptions.append(options->llvmOptions);
// Set whole program mode
diff --git a/rocclr/runtime/device/rocm/rocdefs.hpp b/rocclr/runtime/device/rocm/rocdefs.hpp
index 64a64cc15b..b13e1235ab 100644
--- a/rocclr/runtime/device/rocm/rocdefs.hpp
+++ b/rocclr/runtime/device/rocm/rocdefs.hpp
@@ -22,6 +22,7 @@ struct AMDDeviceInfo {
uint localMemBanks_; //!< Number of banks of local memory
uint gfxipVersion_; //!< The core engine GFXIP version
uint pciDeviceId_; //!< PCIe device id
+ bool xnackEnabled_; //!< Enable XNACK feature
};
// The device ID must match with the device's index into DeviceInfo
@@ -44,25 +45,25 @@ const HsaDeviceId HSA_INVALID_DEVICE_ID = -1;
static const AMDDeviceInfo DeviceInfo[] = {
// targetName machineTarget
/* TARGET_KAVERI_SPECTRE */ {HSA_SPECTRE_ID, "", "kaveri", "Spectre", 4, 16, 1, 256, 64 * Ki,
- 32, 0, 0},
+ 32, 0, 0, false},
/* TARGET_KAVERI_SPOOKY */ {HSA_SPOOKY_ID, "", "kaveri", "Spooky", 4, 16, 1, 256, 64 * Ki, 32,
- 0, 0},
- /* TARGET_TONGA */ {HSA_TONGA_ID, "", "tonga", "Tonga", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
+ 0, 0, false},
+ /* TARGET_TONGA */ {HSA_TONGA_ID, "", "tonga", "Tonga", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
/* TARGET_CARRIZO */ {HSA_CARRIZO_ID, "", "carrizo", "Carrizo", 4, 16, 1, 256, 64 * Ki, 32, 0,
- 0},
+ 0, true},
/* TARGET_ICELAND */ {HSA_ICELAND_ID, "", "iceland", "Iceland", 4, 16, 1, 256, 64 * Ki, 32, 0,
- 0},
- /* TARGET_FIJI */ {HSA_FIJI_ID, "", "fiji", "Fiji", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
- /* TARGET HAWAII */ {HSA_HAWAII_ID, "", "hawaii", "Hawaii", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
+ 0, false},
+ /* TARGET_FIJI */ {HSA_FIJI_ID, "", "fiji", "Fiji", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
+ /* TARGET HAWAII */ {HSA_HAWAII_ID, "", "hawaii", "Hawaii", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
/* TARGET ELLESMERE */ {HSA_ELLESMERE_ID, "", "polaris10", "Ellesmere", 4, 16, 1, 256, 64 * Ki,
- 32, 0, 0},
+ 32, 0, 0, false},
/* TARGET BAFFIN */ {HSA_BAFFIN_ID, "", "polaris11", "Baffin", 4, 16, 1, 256, 64 * Ki, 32, 0,
- 0},
- /* TARGET VEGA10 */ {HSA_VEGA10_ID, "", "gfx900", "gfx900", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
- /* TARGET VEGA10_HBCC */ {HSA_VEGA10_HBCC_ID, "", "gfx901", "gfx901", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
- /* TARGET RAVEN */ {HSA_RAVEN_ID, "", "gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
- /* TARGET VEGA12 */ {HSA_VEGA12_ID, "", "gfx904", "gfx904", 4, 16, 1, 256, 64 * Ki, 32, 0, 0},
- /* TARGET VEGA20 */ {HSA_VEGA20_ID, "", "gfx906", "gfx906", 4, 16, 1, 256, 64 * Ki, 32, 0, 0}};
+ 0, false},
+ /* TARGET VEGA10 */ {HSA_VEGA10_ID, "", "gfx900", "gfx900", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
+ /* TARGET VEGA10_HBCC */ {HSA_VEGA10_HBCC_ID, "", "gfx901", "gfx901", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
+ /* TARGET RAVEN */ {HSA_RAVEN_ID, "", "gfx902", "gfx902", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, true},
+ /* TARGET VEGA12 */ {HSA_VEGA12_ID, "", "gfx904", "gfx904", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false},
+ /* TARGET VEGA20 */ {HSA_VEGA20_ID, "", "gfx906", "gfx906", 4, 16, 1, 256, 64 * Ki, 32, 0, 0, false}};
}
const uint kMaxAsyncQueues = 8; // set to match the number of pipes, which is 8
diff --git a/rocclr/runtime/device/rocm/rocdevice.cpp b/rocclr/runtime/device/rocm/rocdevice.cpp
index 9ac441a50e..f9bc0af9e3 100644
--- a/rocclr/runtime/device/rocm/rocdevice.cpp
+++ b/rocclr/runtime/device/rocm/rocdevice.cpp
@@ -592,6 +592,9 @@ bool Device::create() {
// with dash as delimiter to be compatible with Windows directory name
std::ostringstream cacheTarget;
cacheTarget << "AMD-AMDGPU-" << gfxipMajor << "-" << gfxipMinor << "-" << gfxipStepping;
+ if (deviceInfo_.xnackEnabled_) {
+ cacheTarget << "-xnack";
+ }
amd::CacheCompilation* compObj = new amd::CacheCompilation(
cacheTarget.str(), "_rocm", OCL_CODE_CACHE_ENABLE, OCL_CODE_CACHE_RESET);
@@ -772,6 +775,10 @@ bool Device::populateOCLDeviceConstants() {
std::ostringstream oss;
oss << "gfx" << gfxipMajor << gfxipMinor << gfxipStepping;
+ if (IS_LIGHTNING && deviceInfo_.xnackEnabled_) {
+ oss << "-xnack";
+ }
+
::strcpy(info_.name_, oss.str().c_str());
char device_name[64] = {0};
diff --git a/rocclr/runtime/device/rocm/rocprogram.cpp b/rocclr/runtime/device/rocm/rocprogram.cpp
index fc91ff0179..410e02febd 100644
--- a/rocclr/runtime/device/rocm/rocprogram.cpp
+++ b/rocclr/runtime/device/rocm/rocprogram.cpp
@@ -245,7 +245,7 @@ aclType Program::getNextCompilationStageFromBinary(amd::option::Options* options
break;
}
sBinOptions = std::string((char*)opts, symSize);
- } else
+ } else
#endif // defined(WITH_COMPILER_LIB)
{
sBinOptions = sCurOptions;
@@ -1169,6 +1169,11 @@ bool LightningProgram::linkImpl(amd::option::Options* options) {
codegenOptions.append(" -mcpu=");
codegenOptions.append(dev().deviceInfo().machineTarget_);
+ // Set xnack option if needed
+ if (dev().deviceInfo().xnackEnabled_) {
+ codegenOptions.append(" -mxnack");
+ }
+
// Set the -O#
std::ostringstream optLevel;
optLevel << "-O" << options->oVariables->OptLevel;