def _build_and_catch_errors(self, build_func, options, source=None): try: return build_func() except _cl.RuntimeError, e: from pytools import Record class ErrorRecord(Record): pass what = e.what if options: what = what + "\n(options: %s)" % " ".join(options) if source is not None: from tempfile import NamedTemporaryFile srcfile = NamedTemporaryFile(mode="wt", delete=False, suffix=".cl") try: srcfile.write(source) finally: srcfile.close() what = what + "\n(source saved as %s)" % srcfile.name code = e.code routine = e.routine err = _cl.RuntimeError( ErrorRecord(what=lambda: what, code=lambda: code, routine=lambda: routine))
def build(self, options=[], devices=None, cache_dir=None): if isinstance(options, str): options = [options] options = options + ["-I", _find_pyopencl_include_path()] import os if os.environ.get("PYOPENCL_NO_CACHE") and self._prg is None: self._prg = _cl._Program(self._context, self._source) if self._prg is not None: if isinstance(options, list): options = " ".join(options) self._prg._build(options, devices) else: from pyopencl.cache import create_built_program_from_source_cached err = None try: self._prg = create_built_program_from_source_cached( self._context, self._source, options, devices, cache_dir=cache_dir) except _cl.RuntimeError, e: from pytools import Record class ErrorRecord(Record): pass from tempfile import NamedTemporaryFile srcfile = NamedTemporaryFile(mode="wt", delete=False, suffix=".cl") try: srcfile.write(self._source) finally: srcfile.close() what = e.what + "\n(source saved as %s)" % srcfile.name code = e.code routine = e.routine err = _cl.RuntimeError( ErrorRecord(what=lambda: what, code=lambda: code, routine=lambda: routine)) if err is not None: # Python 3.2 outputs the whole list of currently active exceptions # This serves to remove one (redundant) level from that nesting. raise err del self._context del self._source
def program_build(self, options="", devices=None): try: self._build(options=options, devices=devices) except Exception, e: build_logs = [] for dev in self.devices: try: log = self.get_build_info(dev, program_build_info.LOG) except: log = "<error retrieving log>" build_logs.append((dev, log)) raise _cl.RuntimeError( str(e) + "\n\n" + (75 * "=" + "\n").join("Build on %s:\n\n%s" % (dev, log) for dev, log in build_logs))
def program_build(self, options=[], devices=None): if isinstance(options, list): options = " ".join(options) err = None try: self._build(options=options, devices=devices) except Exception, e: from pytools import Record class ErrorRecord(Record): pass what = e.what + "\n\n" + (75 * "=" + "\n").join( "Build on %s:\n\n%s" % (dev, log) for dev, log in self._get_build_logs()) code = e.code routine = e.routine err = _cl.RuntimeError( ErrorRecord(what=lambda: what, code=lambda: code, routine=lambda: routine))