def preprocess_source(source, options, nvcc): handle, source_path = mkstemp(suffix='.cu') outf = open(source_path, 'w') outf.write(source) outf.close() os.close(handle) cmdline = [nvcc, '--preprocess'] + options + [source_path] if 'win32' in sys.platform: cmdline.extend(['--compiler-options', '-EP']) else: cmdline.extend(['--compiler-options', '-P']) result, stdout, stderr = call_capture_output(cmdline, error_on_nonzero=False) if result != 0: from pycuda.driver import CompileError raise CompileError("nvcc preprocessing of %s failed" % source_path, cmdline, stderr=stderr) # sanity check if len(stdout) < 0.5 * len(source): from pycuda.driver import CompileError raise CompileError("nvcc preprocessing of %s failed with ridiculously " "small code output - likely unsupported compiler." % source_path, cmdline, stderr=stderr.decode("utf-8", "replace")) unlink(source_path) return stdout.decode("utf-8", "replace")
def preprocess_source(source, options, nvcc): handle, source_path = mkstemp(suffix=".cu") outf = open(source_path, "w") outf.write(source) outf.close() os.close(handle) cmdline = [nvcc, "--preprocess"] + options + [source_path] if "win32" in sys.platform: cmdline.extend(["--compiler-options", "-EP"]) else: cmdline.extend(["--compiler-options", "-P"]) result, stdout, stderr = call_capture_output(cmdline, error_on_nonzero=False) if result != 0: from pycuda.driver import CompileError raise CompileError("nvcc preprocessing of %s failed" % source_path, cmdline, stderr=stderr) # sanity check if len(stdout) < 0.5 * len(source): from pycuda.driver import CompileError raise CompileError( "nvcc preprocessing of %s failed with ridiculously " "small code output - likely unsupported compiler." % source_path, cmdline, stderr=stderr.decode("utf-8", "replace"), ) unlink(source_path) preprocessed_str = stdout.decode("utf-8", "replace") # remove the temporary filename from the preprocessed source code to get reproducible hashes return preprocessed_str.replace(os.path.basename(source_path), "")
def compile_plain(source, options, keep, nvcc, cache_dir, target="cubin"): from os.path import join assert target in ["cubin", "ptx", "fatbin"] if cache_dir: checksum = _new_md5() if '#include' in source: checksum.update( preprocess_source(source, options, nvcc).encode("utf-8")) else: checksum.update(source.encode("utf-8")) for option in options: checksum.update(option.encode("utf-8")) checksum.update(get_nvcc_version(nvcc).encode("utf-8")) from pycuda.characterize import platform_bits checksum.update(str(platform_bits()).encode("utf-8")) cache_file = checksum.hexdigest() cache_path = join(cache_dir, cache_file + "." + target) try: cache_file = open(cache_path, "rb") try: return cache_file.read() finally: cache_file.close() except: pass from tempfile import mkdtemp file_dir = mkdtemp() file_root = "kernel" cu_file_name = file_root + ".cu" cu_file_path = join(file_dir, cu_file_name) outf = open(cu_file_path, "w") outf.write(str(source)) outf.close() if keep: options = options[:] options.append("--keep") print("*** compiler output in %s" % file_dir) cmdline = [nvcc, "--" + target] + options + [cu_file_name] result, stdout, stderr = call_capture_output(cmdline, cwd=file_dir, error_on_nonzero=False) try: result_f = open(join(file_dir, file_root + "." + target), "rb") except IOError: no_output = True else: no_output = False if result != 0 or (no_output and (stdout or stderr)): if result == 0: from warnings import warn warn("PyCUDA: nvcc exited with status 0, but appears to have " "encountered an error") from pycuda.driver import CompileError raise CompileError("nvcc compilation of %s failed" % cu_file_path, cmdline, stdout=stdout.decode("utf-8", "replace"), stderr=stderr.decode("utf-8", "replace")) if stdout or stderr: lcase_err_text = (stdout + stderr).decode("utf-8", "replace").lower() from warnings import warn if "demoted" in lcase_err_text or "demoting" in lcase_err_text: warn( "nvcc said it demoted types in source code it " "compiled--this is likely not what you want.", stacklevel=4) warn("The CUDA compiler succeeded, but said the following:\n" + (stdout + stderr).decode("utf-8", "replace"), stacklevel=4) result_data = result_f.read() result_f.close() if cache_dir: outf = open(cache_path, "wb") outf.write(result_data) outf.close() if not keep: from os import listdir, unlink, rmdir for name in listdir(file_dir): unlink(join(file_dir, name)) rmdir(file_dir) return result_data
error_on_nonzero=False) try: cubin_f = open(join(file_dir, file_root + ".cubin"), "rb") except IOError: no_output = True else: no_output = False if result != 0 or (no_output and (stdout or stderr)): if result == 0: from warnings import warn warn("PyCUDA: nvcc exited with status 0, but appears to have " "encountered an error") from pycuda.driver import CompileError raise CompileError("nvcc compilation of %s failed" % cu_file_path, cmdline, stdout=stdout, stderr=stderr) if stdout or stderr: lcase_err_text = (stdout+stderr).lower() if "demoted" in lcase_err_text or "demoting" in lcase_err_text: from pycuda.driver import CompileError raise CompileError("nvcc said it demoted types in source code it " "compiled--this is likely not what you want.", cmdline, stdout=stdout, stderr=stderr) from warnings import warn warn("The CUDA compiler suceeded, but said the following:\n" +stdout+stderr) cubin = cubin_f.read() cubin_f.close()
try: cubin_f = open(join(file_dir, file_root + ".cubin"), "rb") except IOError: no_output = True else: no_output = False if result != 0 or (no_output and (stdout or stderr)): if result == 0: from warnings import warn warn("PyCUDA: nvcc exited with status 0, but appears to have " "encountered an error") from pycuda.driver import CompileError raise CompileError("nvcc compilation of %s failed" % cu_file_path, cmdline, stdout=stdout, stderr=stderr) if stdout or stderr: from warnings import warn warn("The CUDA compiler suceeded, but said the following:\n" + stdout + stderr) cubin = cubin_f.read() cubin_f.close() if cache_dir: outf = open(cache_path, "wb") outf.write(cubin) outf.close()