-
Notifications
You must be signed in to change notification settings - Fork 2
/
cuda.py
executable file
·147 lines (130 loc) · 4.62 KB
/
cuda.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
"""
SCons.Tool.cuda
CUDA Tool for SCons
"""
import os
import sys
import SCons.Tool
import SCons.Scanner.C
import SCons.Defaults
CUDAScanner = SCons.Scanner.C.CScanner()
def CUDANVCCStaticObjectEmitter(target, source, env):
tgt, src = SCons.Defaults.StaticObjectEmitter(target, source, env)
for file in tgt:
lifile = os.path.splitext(file.rstr())[0] + '.linkinfo'
env.SideEffect( lifile, file )
env.Clean( file, lifile )
return tgt, src
def CUDANVCCSharedObjectEmitter(target, source, env):
tgt, src = SCons.Defaults.SharedObjectEmitter(target, source, env)
for file in tgt:
lifile = os.path.splitext(file.rstr())[0] + '.linkinfo'
env.SideEffect( lifile, file )
env.Clean( file, lifile )
return tgt, src
def generate(env):
staticObjBuilder, sharedObjBuilder = SCons.Tool.createObjBuilders(env);
staticObjBuilder.add_action('.cu', '$STATICNVCCCMD')
staticObjBuilder.add_emitter('.cu', CUDANVCCStaticObjectEmitter)
sharedObjBuilder.add_action('.cu', '$SHAREDNVCCCMD')
sharedObjBuilder.add_emitter('.cu', CUDANVCCSharedObjectEmitter)
SCons.Tool.SourceFileScanner.add_scanner('.cu', CUDAScanner)
# default compiler
env['NVCC'] = 'nvcc'
# default flags for the NVCC compiler
env['NVCCFLAGS'] = ''
env['STATICNVCCFLAGS'] = ''
env['SHAREDNVCCFLAGS'] = ''
env['ENABLESHAREDNVCCFLAG'] = '-shared'
# default NVCC commands
env['STATICNVCCCMD'] = '$NVCC -o $TARGET -c $NVCCFLAGS $STATICNVCCFLAGS $SOURCES'
env['SHAREDNVCCCMD'] = '$NVCC -o $TARGET -c $NVCCFLAGS $SHAREDNVCCFLAGS $ENABLESHAREDNVCCFLAG $SOURCES'
# helpers
home=os.environ.get('HOME', '')
programfiles=os.environ.get('PROGRAMFILES', '')
homedrive=os.environ.get('HOMEDRIVE', '')
# find CUDA Toolkit path and set CUDA_TOOLKIT_PATH
try:
cudaToolkitPath = env['CUDA_TOOLKIT_PATH']
except:
paths=[home + '/NVIDIA_CUDA_TOOLKIT',
home + '/Apps/NVIDIA_CUDA_TOOLKIT',
home + '/Apps/NVIDIA_CUDA_TOOLKIT',
home + '/Apps/CudaToolkit',
home + '/Apps/CudaTK',
'/usr/local/NVIDIA_CUDA_TOOLKIT',
'/usr/local/CUDA_TOOLKIT',
'/usr/local/cuda_toolkit',
'/usr/local/CUDA',
'/usr/local/cuda',
'/Developer/NVIDIA CUDA TOOLKIT',
'/Developer/CUDA TOOLKIT',
'/Developer/CUDA',
programfiles + 'NVIDIA Corporation/NVIDIA CUDA TOOLKIT',
programfiles + 'NVIDIA Corporation/NVIDIA CUDA',
programfiles + 'NVIDIA Corporation/CUDA TOOLKIT',
programfiles + 'NVIDIA Corporation/CUDA',
programfiles + 'NVIDIA/NVIDIA CUDA TOOLKIT',
programfiles + 'NVIDIA/NVIDIA CUDA',
programfiles + 'NVIDIA/CUDA TOOLKIT',
programfiles + 'NVIDIA/CUDA',
programfiles + 'CUDA TOOLKIT',
programfiles + 'CUDA',
homedrive + '/CUDA TOOLKIT',
homedrive + '/CUDA']
pathFound = False
for path in paths:
if os.path.isdir(path):
pathFound = True
print 'scons: CUDA Toolkit found in ' + path
cudaToolkitPath = path
break
if not pathFound:
sys.exit("Cannot find the CUDA Toolkit path. Please modify your SConscript or add the path in cudaenv.py")
env['CUDA_TOOLKIT_PATH'] = cudaToolkitPath
# find CUDA SDK path and set CUDA_SDK_PATH
try:
cudaSDKPath = env['CUDA_SDK_PATH']
except:
paths=[home + '/NVIDIA_CUDA_SDK', # i am just guessing here
home + '/Apps/NVIDIA_CUDA_SDK',
home + '/Apps/CudaSDK',
'/usr/local/NVIDIA_CUDA_SDK',
'/usr/local/CUDASDK',
'/usr/local/cuda_sdk',
'/Developer/NVIDIA CUDA SDK',
'/Developer/CUDA SDK',
'/Developer/CUDA',
'/Developer/GPU Computing/C',
programfiles + 'NVIDIA Corporation/NVIDIA CUDA SDK',
programfiles + 'NVIDIA/NVIDIA CUDA SDK',
programfiles + 'NVIDIA CUDA SDK',
programfiles + 'CudaSDK',
homedrive + '/NVIDIA CUDA SDK',
homedrive + '/CUDA SDK',
homedrive + '/CUDA/SDK']
pathFound = False
for path in paths:
if os.path.isdir(path):
pathFound = True
print 'scons: CUDA SDK found in ' + path
cudaSDKPath = path
break
if not pathFound:
sys.exit("Cannot find the CUDA SDK path. Please set env['CUDA_SDK_PATH'] to point to your SDK path")
env['CUDA_SDK_PATH'] = cudaSDKPath
# cuda libraries
if env['PLATFORM'] == 'posix':
cudaSDKSubLibDir = '/linux'
elif env['PLATFORM'] == 'darwin':
cudaSDKSubLibDir = '/darwin'
else:
cudaSDKSubLibDir = ''
# add nvcc to PATH
env.PrependENVPath('PATH', cudaToolkitPath + '/bin')
# add required libraries
# env.Append(CPPPATH=[cudaSDKPath + '/common/inc', cudaToolkitPath + '/include'])
# env.Append(LIBPATH=[cudaSDKPath + '/lib', cudaSDKPath + '/common/lib' + cudaSDKSubLibDir, cudaToolkitPath + '/lib'])
# env.Append(LIBS=['cudart'])
def exists(env):
return env.Detect('nvcc')