Newer
Older
#!/usr/bin/env python
# -*- coding: latin-1 -*-
def get_config_schema():
from aksetup_helper import ConfigSchema, Option, \
IncludeDir, LibraryDir, Libraries, BoostLibraries, \
Switch, StringListOption, make_boost_base_options
return ConfigSchema(make_boost_base_options() + [
Switch("USE_SHIPPED_BOOST", True, "Use included Boost library"),
BoostLibraries("python"),
BoostLibraries("thread"),
Switch("CUDA_TRACE", False, "Enable CUDA API tracing"),
Option("CUDA_ROOT", help="Path to the CUDA toolkit"),
IncludeDir("CUDA", None),
Switch("CUDA_ENABLE_GL", False, "Enable CUDA GL interoperability"),
LibraryDir("CUDADRV", []),
Libraries("CUDADRV", ["cuda"]),
help="Any extra linker options to include"),
])
def search_on_path(filenames):
"""Find file on system path."""
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52224
from os.path import exists, join, abspath
from os import pathsep, environ
search_path = environ["PATH"]
file_found = 0
paths = search_path.split(pathsep)
for path in paths:
for filename in filenames:
if exists(join(path, filename)):
return abspath(join(path, filename))
# verification ----------------------------------------------------------------
def verify_path(description, paths, names, extensions, subpaths=['/'],
try:
from os.path import exists
defaultname = names[0] + extensions[0]
prefixes.append("")
looked_where = []
for path in paths:
for subpath in subpaths:
for prefix in prefixes:
for name in names:
for extension in extensions:
print path, subpath, prefix, name, extension
filename = path + subpath + prefix + name + extension
looked_where.append(filename)
if exists(filename):
return
print "*** Cannot find %s. Checked locations:" % description
for path in looked_where:
print " %s" % path
if maybe_ok:
print "*** Note that this may not be a problem as this " \
"component is often installed system-wide."
except:
print "*** Error occurred in plausibility checking for path of %s." \
% description
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
def verify_siteconfig(sc_vars):
LIB_EXTS = ['.so', '.dylib', '.lib']
LIB_PREFIXES = ['lib']
APP_EXTS = ['', '.exe']
warn_prefix = '!! Warning: '
# BOOST_INC_DIR/boost/python.hpp
if 'BOOST_INC_DIR' in sc_vars:
verify_path (
description="Boost headers",
paths=sc_vars['BOOST_INC_DIR'],
subpaths=['/boost/'],
names=['python'],
extensions=['.hpp']
);
else:
print warn_prefix + 'BOOST_INC_DIR is not set, should be something like "/path/to/boost/include/boost-1_39".'
# BOOST_LIB_DIR/(lib)?BOOST_PYTHON_LIBNAME(.so|.dylib|?Windows?)
if 'BOOST_LIB_DIR' not in sc_vars:
print warn_prefix + 'BOOST_LIB_DIR is not set, should be like BOOST_INC_DIR but with "/lib" instead of "/include/boost-1_39".'
if 'BOOST_PYTHON_LIBNAME' in sc_vars:
verify_path (
description="Boost Python library",
paths=sc_vars['BOOST_LIB_DIR'],
names=sc_vars['BOOST_PYTHON_LIBNAME'],
extensions=LIB_EXTS,
prefixes=LIB_PREFIXES
)
else:
print warn_prefix + 'BOOST_PYTHON_LIBNAME is not set, should be something like "boost_python-*-mt".'
# BOOST_LIB_DIR/(lib)?BOOST_THREAD_LIBNAME(.so|.dylib|?Windows?)
if 'BOOST_THREAD_LIBNAME' in sc_vars:
verify_path(
description="Boost Thread library",
paths=sc_vars['BOOST_LIB_DIR'],
names=sc_vars['BOOST_THREAD_LIBNAME'],
extensions=LIB_EXTS,
prefixes=LIB_PREFIXES
)
else:
print warn_prefix + 'BOOST_THREAD_LIBNAME is not set, should be something like "boost_thread-*-mt".'
# CUDA_ROOT/bin/nvcc(.exe)?
if 'CUDA_ROOT' in sc_vars:
verify_path(
description="CUDA toolkit",
paths=[sc_vars['CUDA_ROOT']],
subpaths=['/bin/'],
names=['nvcc'],
extensions=APP_EXTS,
)
else:
print warn_prefix + 'CUDA_ROOT is not set, should point to the nVidia CUDA Toolkit.'
# CUDA_INC_DIR/cuda.h
if sc_vars.has_key('CUDA_INC_DIR'):
verify_path (
description="CUDA include directory",
paths=sc_vars['CUDA_INC_DIR'],
names=['cuda'],
extensions=['.h'],
)
else:
print warn_prefix + 'CUDA_INC_DIR is not set, should be something like CUDA_ROOT + "/include".'
# CUDADRV_LIB_DIR=(lib)?CUDADRV_LIBNAME(.so|.dylib|?Windows?)
if not sc_vars.has_key('CUDADRV_LIB_DIR'):
print warn_prefix + 'CUDADRV_LIB_DIR is not set, should be something like CUDA_ROOT + "/lib".'
if 'CUDADRV_LIBNAME' in sc_vars:
verify_path (
description="CUDA driver library",
paths=sc_vars['CUDADRV_LIB_DIR'],
names=sc_vars['CUDADRV_LIBNAME'],
extensions=LIB_EXTS,
prefixes=LIB_PREFIXES,
maybe_ok=True,
)
else:
print warn_prefix + 'CUDADRV_LIBNAME is not set, should most likely be "cuda".'
# main functionality ----------------------------------------------------------
from aksetup_helper import (hack_distutils, get_config, setup, \
NumpyExtension, Extension, set_up_shipped_boost_if_requested)
hack_distutils()
conf = get_config(get_config_schema())
EXTRA_SOURCES, EXTRA_DEFINES = set_up_shipped_boost_if_requested(conf)
LIBRARIES = conf["BOOST_PYTHON_LIBNAME"] + conf["BOOST_THREAD_LIBNAME"]
nvcc_path = search_on_path(["nvcc", "nvcc.exe"])
if nvcc_path is None:
print "*** CUDA_ROOT not set, and nvcc not in path. Giving up."
import sys
sys.exit(1)
conf["CUDA_ROOT"] = normpath(join(dirname(nvcc_path), ".."))
conf["CUDA_INC_DIR"] = [join(conf["CUDA_ROOT"], "include")]
if not conf["CUDADRV_LIB_DIR"]:
conf["CUDADRV_LIB_DIR"] = [join(conf["CUDA_ROOT"], "lib")]
EXTRA_INCLUDE_DIRS = []
EXTRA_LIBRARY_DIRS = []
EXTRA_LIBRARIES = []
if conf["CUDA_TRACE"]:
EXTRA_DEFINES["CUDAPP_TRACE_CUDA"] = 1
INCLUDE_DIRS = ['src/cpp'] + conf["BOOST_INC_DIR"] + conf["CUDA_INC_DIR"]
Cosmin Stejerean
committed
import sys
Andreas Klöckner
committed
if 'darwin' in sys.platform and sys.maxint == 2147483647:
# The Python interpreter is running in 32 bit mode on OS X
Cosmin Stejerean
committed
if "-arch" not in conf["CXXFLAGS"]:
conf["CXXFLAGS"].extend(['-arch', 'i386', '-m32'])
Cosmin Stejerean
committed
if "-arch" not in conf["LDFLAGS"]:
conf["LDFLAGS"].extend(['-arch', 'i386', '-m32'])
Cosmin Stejerean
committed
ext_kwargs = dict()
EXTRA_SOURCES.append("src/wrapper/wrap_cudagl.cpp")
ver_dic = {}
execfile("pycuda/__init__.py", ver_dic)
PyCUDA lets you access `Nvidia <http://nvidia.com>`_'s `CUDA
<http://nvidia.com/cuda/>`_ parallel computation API from Python.
Several wrappers of the CUDA API already exist-so what's so special
* Object cleanup tied to lifetime of objects. This idiom, often
called
`RAII <http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization>`_
in C++, makes it much easier to write correct, leak- and
crash-free code. PyCUDA knows about dependencies, too, so (for
example) it won't detach from a context before all memory
allocated in it is also freed.
* Convenience. Abstractions like pycuda.driver.SourceModule and
pycuda.gpuarray.GPUArray make CUDA programming even more
convenient than with Nvidia's C-based runtime.
* Completeness. PyCUDA puts the full power of CUDA's driver API at
your disposal, if you wish. It also includes code for
* Automatic Error Checking. All CUDA errors are automatically
translated into Python exceptions.
* Speed. PyCUDA's base layer is written in C++, so all the niceties
* Helpful `Documentation <http://documen.tician.de/pycuda>`_ and a
`Wiki <http://wiki.tiker.net/PyCuda>`_.
Relatedly, like-minded computing goodness for `OpenCL <http://khronos.org>`_
is provided by PyCUDA's sister project `PyOpenCL <http://pypi.python.org/pypi/pyopencl>`_.
author=u"Andreas Kloeckner",
author_email="inform@tiker.net",
license = "MIT",
url="http://mathema.tician.de/software/pycuda",
'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers',
'Intended Audience :: Other Audience',
'Intended Audience :: Science/Research',
'License :: OSI Approved :: MIT License',
'Natural Language :: English',
'Programming Language :: C++',
'Programming Language :: Python',
'Topic :: Scientific/Engineering',
'Topic :: Scientific/Engineering :: Mathematics',
'Topic :: Scientific/Engineering :: Physics',
'Topic :: Scientific/Engineering :: Visualization',
],
# build info
Andreas Klöckner
committed
packages=["pycuda", "pycuda.gl", "pycuda.sparse"],
"py>=1.0.0b7",
"decorator>=3.2.0"
"src/cpp/cuda.cpp",
"src/cpp/bitlog.cpp",
"src/wrapper/wrap_cudadrv.cpp",
"src/wrapper/mempool.cpp",
include_dirs=INCLUDE_DIRS + EXTRA_INCLUDE_DIRS,
library_dirs=LIBRARY_DIRS + conf["CUDADRV_LIB_DIR"],
libraries=LIBRARIES + conf["CUDADRV_LIBNAME"],
define_macros=list(EXTRA_DEFINES.iteritems()),
extra_compile_args=conf["CXXFLAGS"],
extra_link_args=conf["LDFLAGS"],
),
["src/wrapper/_pycuda_struct.c"],
)],
data_files=[
("include/pycuda", glob.glob("src/cuda/*.hpp"))
if __name__ == '__main__':
main()