Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision f0bb71111cd83022768469968b3891e8656d0417)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 98633434418f1605273227a5a30d24ad28fcf27a)
@@ -384,4 +384,5 @@
         self._workspace.actionCombine_Batch_Fit.triggered.connect(self.actionCombine_Batch_Fit)
         self._workspace.actionFit_Options.triggered.connect(self.actionFit_Options)
+        self._workspace.actionGPU_Options.triggered.connect(self.actionGPU_Options)
         self._workspace.actionFit_Results.triggered.connect(self.actionFit_Results)
         self._workspace.actionChain_Fitting.triggered.connect(self.actionChain_Fitting)
@@ -620,4 +621,12 @@
         pass
 
+    def actionGPU_Options(self):
+        """
+        Load the OpenCL selection dialog if the fitting perspective is active
+        """
+        if hasattr(self._current_perspective, "gpu_options_widget"):
+            self._current_perspective.gpu_options_widget.show()
+        pass
+
     def actionFit_Results(self):
         """
Index: src/sas/qtgui/MainWindow/UI/MainWindowUI.ui
===================================================================
--- src/sas/qtgui/MainWindow/UI/MainWindowUI.ui	(revision b00414d0f96303efbf5b902fc069bbc4e165923d)
+++ src/sas/qtgui/MainWindow/UI/MainWindowUI.ui	(revision 06ce180b727eae5865431e7ab8252438e6178a15)
@@ -25,5 +25,5 @@
      <y>0</y>
      <width>915</width>
-     <height>21</height>
+     <height>26</height>
     </rect>
    </property>
@@ -103,4 +103,5 @@
     <addaction name="separator"/>
     <addaction name="actionFit_Options"/>
+    <addaction name="actionGPU_Options"/>
     <addaction name="actionFit_Results"/>
     <addaction name="separator"/>
@@ -499,4 +500,12 @@
    </property>
   </action>
+  <action name="actionGPU_Options">
+   <property name="text">
+    <string>GPU Options</string>
+   </property>
+   <property name="softKeyRole">
+    <enum>QAction::NoSoftKey</enum>
+   </property>
+  </action>
  </widget>
  <resources/>
Index: src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 377ade1f23aac6c56560870af2702bff99586386)
+++ src/sas/qtgui/Perspectives/Fitting/FittingPerspective.py	(revision 14fa5426b32b70cb507f13bbc8859bfdffec00b6)
@@ -11,4 +11,5 @@
 from sas.qtgui.Perspectives.Fitting.FittingWidget import FittingWidget
 from sas.qtgui.Perspectives.Fitting.FittingOptions import FittingOptions
+from sas.qtgui.Perspectives.Fitting.GPUOptions import GPUOptions
 from sas.qtgui.Perspectives.Fitting import ModelUtilities
 
@@ -60,4 +61,7 @@
         # Listen to GUI Manager signal updating fit options
         self.fit_options_widget.fit_option_changed.connect(self.onFittingOptionsChange)
+
+        # GPU Options
+        self.gpu_options_widget = GPUOptions(self)
 
         self.menu_manager = ModelUtilities.ModelManager()
Index: src/sas/qtgui/Perspectives/Fitting/GPUOptions.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/GPUOptions.py	(revision f629e62f2a3d0e103dc3273e3603f85b36400cac)
+++ src/sas/qtgui/Perspectives/Fitting/GPUOptions.py	(revision f629e62f2a3d0e103dc3273e3603f85b36400cac)
@@ -0,0 +1,242 @@
+# global
+import os
+import sys
+import sasmodels
+import json
+import platform
+
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
+from PyQt4 import QtGui, QtCore, QtWebKit
+from sas.qtgui.Perspectives.Fitting.UI.GPUOptionsUI import Ui_GPUOptions
+from sas.qtgui.Perspectives.Fitting.UI.GPUTestResultsUI import Ui_GPUTestResults
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    def _fromUtf8(s):
+        return s
+
+try:
+    _encoding = QtGui.QApplication.UnicodeUTF8
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig, _encoding)
+except AttributeError:
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig)
+
+
+class GPUOptions(QtGui.QDialog, Ui_GPUOptions):
+    """
+    OpenCL Dialog to select the desired OpenCL driver
+    """
+
+    clicked = False
+    sas_open_cl = None
+
+    def __init__(self, parent=None):
+        super(GPUOptions, self).__init__(parent)
+        self.parent = parent
+        self.setupUi(self)
+        self.addOpenCLOptions()
+        self.setFixedSize(self.size())
+        self.createLinks()
+
+    def addOpenCLOptions(self):
+        """
+        Populate the window with a list of OpenCL options
+        """
+        # Get list of openCL options and add to GUI
+        cl_tuple = _get_clinfo()
+        self.sas_open_cl = os.environ.get("SAS_OPENCL", "")
+        for title, descr in cl_tuple:
+            # Create an item for each openCL option
+            check_box = QtGui.QCheckBox()
+            check_box.setObjectName(_fromUtf8(descr))
+            check_box.setText(_translate("GPUOptions", descr, None))
+            self.optionsLayout.addWidget(check_box)
+            if (descr == self.sas_open_cl) or (
+                            title == "None" and not self.clicked):
+                check_box.click()
+                self.clicked = True
+        self.openCLCheckBoxGroup.setMinimumWidth(
+            self.optionsLayout.sizeHint().width())
+        self.setMinimumWidth(self.verticalLayout.sizeHint().width())
+
+    def createLinks(self):
+        """
+        Link user interactions to function calls
+        """
+        self.testButton.clicked.connect(self.testButtonClicked)
+        self.helpButton.clicked.connect(self.helpButtonClicked)
+        for item in self.openCLCheckBoxGroup.findChildren(QtGui.QCheckBox):
+            item.clicked.connect(self.checked)
+
+    def checked(self):
+        """
+        Only allow a single check box to be selected. Uncheck others.
+        """
+        checked = None
+        for box in self.openCLCheckBoxGroup.findChildren(QtGui.QCheckBox):
+            if box.isChecked() and (str(box.text()) == self.sas_open_cl or (
+                    str(box.text()) == "No OpenCL" and self.sas_open_cl == "")):
+                box.setChecked(False)
+            elif box.isChecked():
+                checked = box
+        if hasattr(checked, "text"):
+            self.sas_open_cl = str(checked.text())
+        else:
+            self.sas_open_cl = None
+
+    def set_sas_open_cl(self):
+        """
+        Set SAS_OPENCL value when tests run or OK button clicked
+        """
+        no_opencl_msg = False
+        if self.sas_open_cl:
+            os.environ["SAS_OPENCL"] = self.sas_open_cl
+            if self.sas_open_cl.lower() == "none":
+                no_opencl_msg = True
+        else:
+            if "SAS_OPENCL" in os.environ:
+                del os.environ["SAS_OPENCL"]
+        # Sasmodels kernelcl doesn't exist when initiated with None
+        if 'sasmodels.kernelcl' in sys.modules:
+            sasmodels.kernelcl.ENV = None
+        reload(sasmodels.core)
+        return no_opencl_msg
+
+    def testButtonClicked(self):
+        """
+        Run sasmodels check from here and report results from
+        """
+
+        no_opencl_msg = self.set_sas_open_cl()
+
+        # Only import when tests are run
+        from sasmodels.model_test import model_tests
+
+        try:
+            from sasmodels.kernelcl import environment
+            env = environment()
+            clinfo = [(ctx.devices[0].platform.vendor,
+                       ctx.devices[0].platform.version,
+                       ctx.devices[0].vendor,
+                       ctx.devices[0].name,
+                       ctx.devices[0].version)
+                      for ctx in env.context]
+        except ImportError:
+            clinfo = None
+
+        failures = []
+        tests_completed = 0
+        for test in model_tests():
+            try:
+                test()
+            except Exception:
+                failures.append(test.description)
+
+            tests_completed += 1
+
+        info = {
+            'version': sasmodels.__version__,
+            'platform': platform.uname(),
+            'opencl': clinfo,
+            'failing tests': failures,
+        }
+
+        msg = str(tests_completed) + ' tests completed.\n'
+        if len(failures) > 0:
+            msg += str(len(failures)) + ' tests failed.\n'
+            msg += 'Failing tests: '
+            msg += json.dumps(info['failing tests'])
+            msg += "\n"
+        else:
+            msg += "All tests passed!\n"
+
+        msg += "\nPlatform Details:\n\n"
+        msg += "Sasmodels version: "
+        msg += info['version'] + "\n"
+        msg += "\nPlatform used: "
+        msg += json.dumps(info['platform']) + "\n"
+        if no_opencl_msg:
+            msg += "\nOpenCL driver: None"
+        else:
+            msg += "\nOpenCL driver: "
+            msg += json.dumps(info['opencl']) + "\n"
+        GPUTestResults(self, msg)
+
+    def helpButtonClicked(self):
+        """
+        Open the help menu when the help button is clicked
+        """
+        help_location = GuiUtils.HELP_DIRECTORY_LOCATION
+        help_location += "/user/sasgui/perspectives/fitting/gpu_setup.html"
+        help_location += "#device-selection"
+        self.helpView = QtWebKit.QWebView()
+        self.helpView.load(QtCore.QUrl(help_location))
+        self.helpView.show()
+
+    def reject(self):
+        """
+        Close the window without modifying SAS_OPENCL
+        """
+        self.closeEvent(None)
+        self.parent.gpu_options_widget.open()
+
+    def accept(self):
+        """
+        Close the window after modifying the SAS_OPENCL value
+        """
+        self.set_sas_open_cl()
+        self.closeEvent(None)
+
+    def closeEvent(self, event):
+        """
+        Overwrite QDialog close method to allow for custom widget close
+        """
+        self.close()
+        self.parent.gpu_options_widget = GPUOptions(self.parent)
+
+
+class GPUTestResults(QtGui.QDialog, Ui_GPUTestResults):
+    """
+    OpenCL Dialog to modify the OpenCL options
+    """
+    def __init__(self, parent, msg):
+        super(GPUTestResults, self).__init__(parent)
+        self.setupUi(self)
+        self.resultsText.setText(_translate("GPUTestResults", msg, None))
+        self.setFixedSize(self.size())
+        self.open()
+
+
+def _get_clinfo():
+    """
+    Read in information about available OpenCL infrastructure
+    """
+    clinfo = []
+    cl_platforms = []
+    try:
+        import pyopencl as cl
+        cl_platforms = cl.get_platforms()
+    except ImportError:
+        print("pyopencl import failed. Using only CPU computations")
+
+    p_index = 0
+    for cl_platform in cl_platforms:
+        d_index = 0
+        cl_platforms = cl_platform.get_devices()
+        for cl_platform in cl_platforms:
+            if len(cl_platforms) > 1 and len(cl_platforms) > 1:
+                combined_index = ":".join([str(p_index), str(d_index)])
+            elif len(cl_platforms) > 1:
+                combined_index = str(p_index)
+            else:
+                combined_index = str(d_index)
+            clinfo.append((combined_index, ":".join([cl_platform.name,
+                                                     cl_platform.name])))
+            d_index += 1
+        p_index += 1
+
+    clinfo.append(("None", "No OpenCL"))
+    return clinfo
Index: src/sas/qtgui/Perspectives/Fitting/UI/GPUOptionsUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/GPUOptionsUI.ui	(revision f629e62f2a3d0e103dc3273e3603f85b36400cac)
+++ src/sas/qtgui/Perspectives/Fitting/UI/GPUOptionsUI.ui	(revision f629e62f2a3d0e103dc3273e3603f85b36400cac)
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GPUOptions</class>
+ <widget class="QDialog" name="GPUOptions">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>432</width>
+    <height>241</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>OpenCL Options</string>
+  </property>
+  <property name="windowIcon">
+   <iconset>
+    <normaloff>../../../UI/res/ball.ico</normaloff>../../../UI/res/ball.ico</iconset>
+  </property>
+  <widget class="QWidget" name="verticalLayoutWidget_2">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>431</width>
+     <height>241</height>
+    </rect>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout" stretch="5,1,0">
+    <property name="sizeConstraint">
+     <enum>QLayout::SetMinimumSize</enum>
+    </property>
+    <property name="margin">
+     <number>10</number>
+    </property>
+    <item>
+     <widget class="QGroupBox" name="openCLCheckBoxGroup">
+      <property name="title">
+       <string>Available OpenCL Options</string>
+      </property>
+      <widget class="QWidget" name="verticalLayoutWidget">
+       <property name="geometry">
+        <rect>
+         <x>0</x>
+         <y>10</y>
+         <width>411</width>
+         <height>131</height>
+        </rect>
+       </property>
+       <layout class="QVBoxLayout" name="optionsLayout">
+        <property name="sizeConstraint">
+         <enum>QLayout::SetMinimumSize</enum>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+    <item>
+     <widget class="QLabel" name="warningMessage">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <property name="font">
+       <font>
+        <pointsize>8</pointsize>
+       </font>
+      </property>
+      <property name="text">
+       <string>WARNING: Running tests can take a few minutes!</string>
+      </property>
+      <property name="alignment">
+       <set>Qt::AlignCenter</set>
+      </property>
+     </widget>
+    </item>
+    <item>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="sizeConstraint">
+       <enum>QLayout::SetMinimumSize</enum>
+      </property>
+      <item>
+       <widget class="QPushButton" name="okButton">
+        <property name="text">
+         <string>OK</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="resetButton">
+        <property name="text">
+         <string>Reset</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="testButton">
+        <property name="text">
+         <string>Test</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="helpButton">
+        <property name="text">
+         <string>Help</string>
+        </property>
+        <property name="autoDefault">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>okButton</sender>
+   <signal>clicked()</signal>
+   <receiver>GPUOptions</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>66</x>
+     <y>183</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>219</x>
+     <y>88</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>resetButton</sender>
+   <signal>clicked()</signal>
+   <receiver>GPUOptions</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>266</x>
+     <y>183</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>219</x>
+     <y>88</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
Index: src/sas/qtgui/Perspectives/Fitting/UI/GPUTestResultsUI.ui
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UI/GPUTestResultsUI.ui	(revision c31d41e76f6ccb16a40f594da9b7c0568c534436)
+++ src/sas/qtgui/Perspectives/Fitting/UI/GPUTestResultsUI.ui	(revision c31d41e76f6ccb16a40f594da9b7c0568c534436)
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GPUTestResults</class>
+ <widget class="QDialog" name="GPUTestResults">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>441</width>
+    <height>439</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>OpenCL Test Results</string>
+  </property>
+  <property name="windowIcon">
+   <iconset>
+    <normaloff>../../../UI/res/ball.ico</normaloff>../../../UI/res/ball.ico</iconset>
+  </property>
+  <widget class="QDialogButtonBox" name="okButton">
+   <property name="geometry">
+    <rect>
+     <x>10</x>
+     <y>400</y>
+     <width>411</width>
+     <height>32</height>
+    </rect>
+   </property>
+   <property name="orientation">
+    <enum>Qt::Horizontal</enum>
+   </property>
+   <property name="standardButtons">
+    <set>QDialogButtonBox::Ok</set>
+   </property>
+   <property name="centerButtons">
+    <bool>false</bool>
+   </property>
+  </widget>
+  <widget class="QLabel" name="falingTestsNoOpenCL">
+   <property name="geometry">
+    <rect>
+     <x>20</x>
+     <y>330</y>
+     <width>401</width>
+     <height>31</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>If tests fail on OpenCL devices, please select the No OpenCL option.</string>
+   </property>
+   <property name="alignment">
+    <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+   </property>
+  </widget>
+  <widget class="QLabel" name="howToReportIssues">
+   <property name="geometry">
+    <rect>
+     <x>20</x>
+     <y>360</y>
+     <width>401</width>
+     <height>41</height>
+    </rect>
+   </property>
+   <property name="text">
+    <string>In the case where many tests are failing, please consider sending the above report to help@sasview.org.</string>
+   </property>
+   <property name="alignment">
+    <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+   </property>
+   <property name="wordWrap">
+    <bool>true</bool>
+   </property>
+  </widget>
+  <widget class="QGroupBox" name="TestResultsBox">
+   <property name="geometry">
+    <rect>
+     <x>20</x>
+     <y>10</y>
+     <width>401</width>
+     <height>321</height>
+    </rect>
+   </property>
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="title">
+    <string>OpenCL test results</string>
+   </property>
+   <widget class="QLabel" name="resultsText">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>20</y>
+      <width>381</width>
+      <height>291</height>
+     </rect>
+    </property>
+    <property name="sizePolicy">
+     <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+      <horstretch>0</horstretch>
+      <verstretch>0</verstretch>
+     </sizepolicy>
+    </property>
+    <property name="frameShape">
+     <enum>QFrame::StyledPanel</enum>
+    </property>
+    <property name="frameShadow">
+     <enum>QFrame::Sunken</enum>
+    </property>
+    <property name="text">
+     <string>TextLabel</string>
+    </property>
+    <property name="alignment">
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+    </property>
+    <property name="wordWrap">
+     <bool>true</bool>
+    </property>
+   </widget>
+  </widget>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>okButton</sender>
+   <signal>accepted()</signal>
+   <receiver>GPUTestResults</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>228</x>
+     <y>414</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>okButton</sender>
+   <signal>rejected()</signal>
+   <receiver>GPUTestResults</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>296</x>
+     <y>420</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
