xref: /aosp_15_r20/external/pytorch/cmake/Modules/FindCUDAToolkit.cmake (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker
2*da0073e9SAndroid Build Coastguard Worker# This module is back-ported from CMake 3.17 and above to work with CMake 3.10
3*da0073e9SAndroid Build Coastguard Worker
4*da0073e9SAndroid Build Coastguard Worker# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
5*da0073e9SAndroid Build Coastguard Worker# file Copyright.txt or https://cmake.org/licensing for details.
6*da0073e9SAndroid Build Coastguard Worker
7*da0073e9SAndroid Build Coastguard Worker#[=======================================================================[.rst:
8*da0073e9SAndroid Build Coastguard WorkerFindCUDAToolkit
9*da0073e9SAndroid Build Coastguard Worker---------------
10*da0073e9SAndroid Build Coastguard Worker
11*da0073e9SAndroid Build Coastguard Worker.. versionadded:: 3.17
12*da0073e9SAndroid Build Coastguard Worker
13*da0073e9SAndroid Build Coastguard WorkerThis script locates the NVIDIA CUDA toolkit and the associated libraries, but
14*da0073e9SAndroid Build Coastguard Workerdoes not require the ``CUDA`` language be enabled for a given project. This
15*da0073e9SAndroid Build Coastguard Workermodule does not search for the NVIDIA CUDA Samples.
16*da0073e9SAndroid Build Coastguard Worker
17*da0073e9SAndroid Build Coastguard Worker.. versionadded:: 3.19
18*da0073e9SAndroid Build Coastguard Worker  QNX support.
19*da0073e9SAndroid Build Coastguard Worker
20*da0073e9SAndroid Build Coastguard WorkerSearch Behavior
21*da0073e9SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^
22*da0073e9SAndroid Build Coastguard Worker
23*da0073e9SAndroid Build Coastguard WorkerThe CUDA Toolkit search behavior uses the following order:
24*da0073e9SAndroid Build Coastguard Worker
25*da0073e9SAndroid Build Coastguard Worker1. If the ``CUDA`` language has been enabled we will use the directory
26*da0073e9SAndroid Build Coastguard Worker   containing the compiler as the first search location for ``nvcc``.
27*da0073e9SAndroid Build Coastguard Worker
28*da0073e9SAndroid Build Coastguard Worker2. If the ``CUDAToolkit_ROOT`` cmake configuration variable (e.g.,
29*da0073e9SAndroid Build Coastguard Worker   ``-DCUDAToolkit_ROOT=/some/path``) *or* environment variable is defined, it
30*da0073e9SAndroid Build Coastguard Worker   will be searched.  If both an environment variable **and** a
31*da0073e9SAndroid Build Coastguard Worker   configuration variable are specified, the *configuration* variable takes
32*da0073e9SAndroid Build Coastguard Worker   precedence.
33*da0073e9SAndroid Build Coastguard Worker
34*da0073e9SAndroid Build Coastguard Worker   The directory specified here must be such that the executable ``nvcc`` or
35*da0073e9SAndroid Build Coastguard Worker   the appropriate ``version.txt`` file can be found underneath the specified
36*da0073e9SAndroid Build Coastguard Worker   directory.
37*da0073e9SAndroid Build Coastguard Worker
38*da0073e9SAndroid Build Coastguard Worker3. If the CUDA_PATH environment variable is defined, it will be searched
39*da0073e9SAndroid Build Coastguard Worker   for ``nvcc``.
40*da0073e9SAndroid Build Coastguard Worker
41*da0073e9SAndroid Build Coastguard Worker4. The user's path is searched for ``nvcc`` using :command:`find_program`.  If
42*da0073e9SAndroid Build Coastguard Worker   this is found, no subsequent search attempts are performed.  Users are
43*da0073e9SAndroid Build Coastguard Worker   responsible for ensuring that the first ``nvcc`` to show up in the path is
44*da0073e9SAndroid Build Coastguard Worker   the desired path in the event that multiple CUDA Toolkits are installed.
45*da0073e9SAndroid Build Coastguard Worker
46*da0073e9SAndroid Build Coastguard Worker5. On Unix systems, if the symbolic link ``/usr/local/cuda`` exists, this is
47*da0073e9SAndroid Build Coastguard Worker   used.  No subsequent search attempts are performed.  No default symbolic link
48*da0073e9SAndroid Build Coastguard Worker   location exists for the Windows platform.
49*da0073e9SAndroid Build Coastguard Worker
50*da0073e9SAndroid Build Coastguard Worker6. The platform specific default install locations are searched.  If exactly one
51*da0073e9SAndroid Build Coastguard Worker   candidate is found, this is used.  The default CUDA Toolkit install locations
52*da0073e9SAndroid Build Coastguard Worker   searched are:
53*da0073e9SAndroid Build Coastguard Worker
54*da0073e9SAndroid Build Coastguard Worker   +-------------+-------------------------------------------------------------+
55*da0073e9SAndroid Build Coastguard Worker   | Platform    | Search Pattern                                              |
56*da0073e9SAndroid Build Coastguard Worker   +=============+=============================================================+
57*da0073e9SAndroid Build Coastguard Worker   | macOS       | ``/Developer/NVIDIA/CUDA-X.Y``                              |
58*da0073e9SAndroid Build Coastguard Worker   +-------------+-------------------------------------------------------------+
59*da0073e9SAndroid Build Coastguard Worker   | Other Unix  | ``/usr/local/cuda-X.Y``                                     |
60*da0073e9SAndroid Build Coastguard Worker   +-------------+-------------------------------------------------------------+
61*da0073e9SAndroid Build Coastguard Worker   | Windows     | ``C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y`` |
62*da0073e9SAndroid Build Coastguard Worker   +-------------+-------------------------------------------------------------+
63*da0073e9SAndroid Build Coastguard Worker
64*da0073e9SAndroid Build Coastguard Worker   Where ``X.Y`` would be a specific version of the CUDA Toolkit, such as
65*da0073e9SAndroid Build Coastguard Worker   ``/usr/local/cuda-9.0`` or
66*da0073e9SAndroid Build Coastguard Worker   ``C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0``
67*da0073e9SAndroid Build Coastguard Worker
68*da0073e9SAndroid Build Coastguard Worker   .. note::
69*da0073e9SAndroid Build Coastguard Worker
70*da0073e9SAndroid Build Coastguard Worker       When multiple CUDA Toolkits are installed in the default location of a
71*da0073e9SAndroid Build Coastguard Worker       system(e.g., both ``/usr/local/cuda-9.0`` and ``/usr/local/cuda-10.0``
72*da0073e9SAndroid Build Coastguard Worker       exist but the ``/usr/local/cuda`` symbolic link does **not** exist), this
73*da0073e9SAndroid Build Coastguard Worker       package is marked as **not** found.
74*da0073e9SAndroid Build Coastguard Worker
75*da0073e9SAndroid Build Coastguard Worker       There are too many factors involved in making an automatic decision in
76*da0073e9SAndroid Build Coastguard Worker       the presence of multiple CUDA Toolkits being installed.  In this
77*da0073e9SAndroid Build Coastguard Worker       situation, users are encouraged to either (1) set ``CUDAToolkit_ROOT`` or
78*da0073e9SAndroid Build Coastguard Worker       (2) ensure that the correct ``nvcc`` executable shows up in ``$PATH`` for
79*da0073e9SAndroid Build Coastguard Worker       :command:`find_program` to find.
80*da0073e9SAndroid Build Coastguard Worker
81*da0073e9SAndroid Build Coastguard WorkerArguments
82*da0073e9SAndroid Build Coastguard Worker^^^^^^^^^
83*da0073e9SAndroid Build Coastguard Worker
84*da0073e9SAndroid Build Coastguard Worker``[<version>]``
85*da0073e9SAndroid Build Coastguard Worker    The ``[<version>]`` argument requests a version with which the package found
86*da0073e9SAndroid Build Coastguard Worker    should be compatible. See :ref:`find_package version format <FIND_PACKAGE_VERSION_FORMAT>`
87*da0073e9SAndroid Build Coastguard Worker    for more details.
88*da0073e9SAndroid Build Coastguard Worker
89*da0073e9SAndroid Build Coastguard WorkerOptions
90*da0073e9SAndroid Build Coastguard Worker^^^^^^^
91*da0073e9SAndroid Build Coastguard Worker
92*da0073e9SAndroid Build Coastguard Worker``REQUIRED``
93*da0073e9SAndroid Build Coastguard Worker    If specified, configuration will error if a suitable CUDA Toolkit is not
94*da0073e9SAndroid Build Coastguard Worker    found.
95*da0073e9SAndroid Build Coastguard Worker
96*da0073e9SAndroid Build Coastguard Worker``QUIET``
97*da0073e9SAndroid Build Coastguard Worker    If specified, the search for a suitable CUDA Toolkit will not produce any
98*da0073e9SAndroid Build Coastguard Worker    messages.
99*da0073e9SAndroid Build Coastguard Worker
100*da0073e9SAndroid Build Coastguard Worker``EXACT``
101*da0073e9SAndroid Build Coastguard Worker    If specified, the CUDA Toolkit is considered found only if the exact
102*da0073e9SAndroid Build Coastguard Worker    ``VERSION`` specified is recovered.
103*da0073e9SAndroid Build Coastguard Worker
104*da0073e9SAndroid Build Coastguard WorkerImported targets
105*da0073e9SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^
106*da0073e9SAndroid Build Coastguard Worker
107*da0073e9SAndroid Build Coastguard WorkerAn :ref:`imported target <Imported targets>` named ``CUDA::toolkit`` is provided.
108*da0073e9SAndroid Build Coastguard Worker
109*da0073e9SAndroid Build Coastguard WorkerThis module defines :prop_tgt:`IMPORTED` targets for each
110*da0073e9SAndroid Build Coastguard Workerof the following libraries that are part of the CUDAToolkit:
111*da0073e9SAndroid Build Coastguard Worker
112*da0073e9SAndroid Build Coastguard Worker- :ref:`CUDA Runtime Library<cuda_toolkit_rt_lib>`
113*da0073e9SAndroid Build Coastguard Worker- :ref:`CUDA Driver Library<cuda_toolkit_driver_lib>`
114*da0073e9SAndroid Build Coastguard Worker- :ref:`cuBLAS<cuda_toolkit_cuBLAS>`
115*da0073e9SAndroid Build Coastguard Worker- :ref:`cuFFT<cuda_toolkit_cuFFT>`
116*da0073e9SAndroid Build Coastguard Worker- :ref:`cuRAND<cuda_toolkit_cuRAND>`
117*da0073e9SAndroid Build Coastguard Worker- :ref:`cuSOLVER<cuda_toolkit_cuSOLVER>`
118*da0073e9SAndroid Build Coastguard Worker- :ref:`cuSPARSE<cuda_toolkit_cuSPARSE>`
119*da0073e9SAndroid Build Coastguard Worker- :ref:`cuPTI<cuda_toolkit_cupti>`
120*da0073e9SAndroid Build Coastguard Worker- :ref:`NPP<cuda_toolkit_NPP>`
121*da0073e9SAndroid Build Coastguard Worker- :ref:`nvBLAS<cuda_toolkit_nvBLAS>`
122*da0073e9SAndroid Build Coastguard Worker- :ref:`nvGRAPH<cuda_toolkit_nvGRAPH>`
123*da0073e9SAndroid Build Coastguard Worker- :ref:`nvJPEG<cuda_toolkit_nvJPEG>`
124*da0073e9SAndroid Build Coastguard Worker- :ref:`nvidia-ML<cuda_toolkit_nvML>`
125*da0073e9SAndroid Build Coastguard Worker- :ref:`nvRTC<cuda_toolkit_nvRTC>`
126*da0073e9SAndroid Build Coastguard Worker- :ref:`nvToolsExt<cuda_toolkit_nvToolsExt>`
127*da0073e9SAndroid Build Coastguard Worker- :ref:`OpenCL<cuda_toolkit_opencl>`
128*da0073e9SAndroid Build Coastguard Worker- :ref:`cuLIBOS<cuda_toolkit_cuLIBOS>`
129*da0073e9SAndroid Build Coastguard Worker
130*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_rt_lib`:
131*da0073e9SAndroid Build Coastguard Worker
132*da0073e9SAndroid Build Coastguard WorkerCUDA Runtime Library
133*da0073e9SAndroid Build Coastguard Worker""""""""""""""""""""
134*da0073e9SAndroid Build Coastguard Worker
135*da0073e9SAndroid Build Coastguard WorkerThe CUDA Runtime library (cudart) are what most applications will typically
136*da0073e9SAndroid Build Coastguard Workerneed to link against to make any calls such as `cudaMalloc`, and `cudaFree`.
137*da0073e9SAndroid Build Coastguard Worker
138*da0073e9SAndroid Build Coastguard WorkerTargets Created:
139*da0073e9SAndroid Build Coastguard Worker
140*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cudart``
141*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cudart_static``
142*da0073e9SAndroid Build Coastguard Worker
143*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_driver_lib`:
144*da0073e9SAndroid Build Coastguard Worker
145*da0073e9SAndroid Build Coastguard WorkerCUDA Driver Library
146*da0073e9SAndroid Build Coastguard Worker""""""""""""""""""""
147*da0073e9SAndroid Build Coastguard Worker
148*da0073e9SAndroid Build Coastguard WorkerThe CUDA Driver library (cuda) are used by applications that use calls
149*da0073e9SAndroid Build Coastguard Workersuch as `cuMemAlloc`, and `cuMemFree`.
150*da0073e9SAndroid Build Coastguard Worker
151*da0073e9SAndroid Build Coastguard WorkerTargets Created:
152*da0073e9SAndroid Build Coastguard Worker
153*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cuda_driver``
154*da0073e9SAndroid Build Coastguard Worker
155*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuBLAS`:
156*da0073e9SAndroid Build Coastguard Worker
157*da0073e9SAndroid Build Coastguard WorkercuBLAS
158*da0073e9SAndroid Build Coastguard Worker""""""
159*da0073e9SAndroid Build Coastguard Worker
160*da0073e9SAndroid Build Coastguard WorkerThe `cuBLAS <https://docs.nvidia.com/cuda/cublas/index.html>`_ library.
161*da0073e9SAndroid Build Coastguard Worker
162*da0073e9SAndroid Build Coastguard WorkerTargets Created:
163*da0073e9SAndroid Build Coastguard Worker
164*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cublas``
165*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cublas_static``
166*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cublasLt`` starting in CUDA 10.1
167*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cublasLt_static`` starting in CUDA 10.1
168*da0073e9SAndroid Build Coastguard Worker
169*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuFFT`:
170*da0073e9SAndroid Build Coastguard Worker
171*da0073e9SAndroid Build Coastguard WorkercuFFT
172*da0073e9SAndroid Build Coastguard Worker"""""
173*da0073e9SAndroid Build Coastguard Worker
174*da0073e9SAndroid Build Coastguard WorkerThe `cuFFT <https://docs.nvidia.com/cuda/cufft/index.html>`_ library.
175*da0073e9SAndroid Build Coastguard Worker
176*da0073e9SAndroid Build Coastguard WorkerTargets Created:
177*da0073e9SAndroid Build Coastguard Worker
178*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cufft``
179*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cufftw``
180*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cufft_static``
181*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cufft_static_nocallback`` starting in CUDA 9.2, requires CMake 3.23+
182*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cufftw_static``
183*da0073e9SAndroid Build Coastguard Worker
184*da0073e9SAndroid Build Coastguard WorkercuRAND
185*da0073e9SAndroid Build Coastguard Worker""""""
186*da0073e9SAndroid Build Coastguard Worker
187*da0073e9SAndroid Build Coastguard WorkerThe `cuRAND <https://docs.nvidia.com/cuda/curand/index.html>`_ library.
188*da0073e9SAndroid Build Coastguard Worker
189*da0073e9SAndroid Build Coastguard WorkerTargets Created:
190*da0073e9SAndroid Build Coastguard Worker
191*da0073e9SAndroid Build Coastguard Worker- ``CUDA::curand``
192*da0073e9SAndroid Build Coastguard Worker- ``CUDA::curand_static``
193*da0073e9SAndroid Build Coastguard Worker
194*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuSOLVER`:
195*da0073e9SAndroid Build Coastguard Worker
196*da0073e9SAndroid Build Coastguard WorkercuSOLVER
197*da0073e9SAndroid Build Coastguard Worker""""""""
198*da0073e9SAndroid Build Coastguard Worker
199*da0073e9SAndroid Build Coastguard WorkerThe `cuSOLVER <https://docs.nvidia.com/cuda/cusolver/index.html>`_ library.
200*da0073e9SAndroid Build Coastguard Worker
201*da0073e9SAndroid Build Coastguard WorkerTargets Created:
202*da0073e9SAndroid Build Coastguard Worker
203*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cusolver``
204*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cusolver_static``
205*da0073e9SAndroid Build Coastguard Worker
206*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuSPARSE`:
207*da0073e9SAndroid Build Coastguard Worker
208*da0073e9SAndroid Build Coastguard WorkercuSPARSE
209*da0073e9SAndroid Build Coastguard Worker""""""""
210*da0073e9SAndroid Build Coastguard Worker
211*da0073e9SAndroid Build Coastguard WorkerThe `cuSPARSE <https://docs.nvidia.com/cuda/cusparse/index.html>`_ library.
212*da0073e9SAndroid Build Coastguard Worker
213*da0073e9SAndroid Build Coastguard WorkerTargets Created:
214*da0073e9SAndroid Build Coastguard Worker
215*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cusparse``
216*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cusparse_static``
217*da0073e9SAndroid Build Coastguard Worker
218*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cupti`:
219*da0073e9SAndroid Build Coastguard Worker
220*da0073e9SAndroid Build Coastguard Workercupti
221*da0073e9SAndroid Build Coastguard Worker"""""
222*da0073e9SAndroid Build Coastguard Worker
223*da0073e9SAndroid Build Coastguard WorkerThe `NVIDIA CUDA Profiling Tools Interface <https://developer.nvidia.com/CUPTI>`_.
224*da0073e9SAndroid Build Coastguard Worker
225*da0073e9SAndroid Build Coastguard WorkerTargets Created:
226*da0073e9SAndroid Build Coastguard Worker
227*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cupti``
228*da0073e9SAndroid Build Coastguard Worker- ``CUDA::cupti_static``
229*da0073e9SAndroid Build Coastguard Worker
230*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_NPP`:
231*da0073e9SAndroid Build Coastguard Worker
232*da0073e9SAndroid Build Coastguard WorkerNPP
233*da0073e9SAndroid Build Coastguard Worker"""
234*da0073e9SAndroid Build Coastguard Worker
235*da0073e9SAndroid Build Coastguard WorkerThe `NPP <https://docs.nvidia.com/cuda/npp/index.html>`_ libraries.
236*da0073e9SAndroid Build Coastguard Worker
237*da0073e9SAndroid Build Coastguard WorkerTargets Created:
238*da0073e9SAndroid Build Coastguard Worker
239*da0073e9SAndroid Build Coastguard Worker- `nppc`:
240*da0073e9SAndroid Build Coastguard Worker
241*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppc``
242*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppc_static``
243*da0073e9SAndroid Build Coastguard Worker
244*da0073e9SAndroid Build Coastguard Worker- `nppial`: Arithmetic and logical operation functions in `nppi_arithmetic_and_logical_operations.h`
245*da0073e9SAndroid Build Coastguard Worker
246*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppial``
247*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppial_static``
248*da0073e9SAndroid Build Coastguard Worker
249*da0073e9SAndroid Build Coastguard Worker- `nppicc`: Color conversion and sampling functions in `nppi_color_conversion.h`
250*da0073e9SAndroid Build Coastguard Worker
251*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppicc``
252*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppicc_static``
253*da0073e9SAndroid Build Coastguard Worker
254*da0073e9SAndroid Build Coastguard Worker- `nppicom`: JPEG compression and decompression functions in `nppi_compression_functions.h`
255*da0073e9SAndroid Build Coastguard Worker  Removed starting in CUDA 11.0, use :ref:`nvJPEG<cuda_toolkit_nvJPEG>` instead.
256*da0073e9SAndroid Build Coastguard Worker
257*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppicom``
258*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppicom_static``
259*da0073e9SAndroid Build Coastguard Worker
260*da0073e9SAndroid Build Coastguard Worker- `nppidei`: Data exchange and initialization functions in `nppi_data_exchange_and_initialization.h`
261*da0073e9SAndroid Build Coastguard Worker
262*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppidei``
263*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppidei_static``
264*da0073e9SAndroid Build Coastguard Worker
265*da0073e9SAndroid Build Coastguard Worker- `nppif`: Filtering and computer vision functions in `nppi_filter_functions.h`
266*da0073e9SAndroid Build Coastguard Worker
267*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppif``
268*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppif_static``
269*da0073e9SAndroid Build Coastguard Worker
270*da0073e9SAndroid Build Coastguard Worker- `nppig`: Geometry transformation functions found in `nppi_geometry_transforms.h`
271*da0073e9SAndroid Build Coastguard Worker
272*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppig``
273*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppig_static``
274*da0073e9SAndroid Build Coastguard Worker
275*da0073e9SAndroid Build Coastguard Worker- `nppim`: Morphological operation functions found in `nppi_morphological_operations.h`
276*da0073e9SAndroid Build Coastguard Worker
277*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppim``
278*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppim_static``
279*da0073e9SAndroid Build Coastguard Worker
280*da0073e9SAndroid Build Coastguard Worker- `nppist`: Statistics and linear transform in `nppi_statistics_functions.h` and `nppi_linear_transforms.h`
281*da0073e9SAndroid Build Coastguard Worker
282*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppist``
283*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppist_static``
284*da0073e9SAndroid Build Coastguard Worker
285*da0073e9SAndroid Build Coastguard Worker- `nppisu`: Memory support functions in `nppi_support_functions.h`
286*da0073e9SAndroid Build Coastguard Worker
287*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppisu``
288*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppisu_static``
289*da0073e9SAndroid Build Coastguard Worker
290*da0073e9SAndroid Build Coastguard Worker- `nppitc`: Threshold and compare operation functions in `nppi_threshold_and_compare_operations.h`
291*da0073e9SAndroid Build Coastguard Worker
292*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppitc``
293*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::nppitc_static``
294*da0073e9SAndroid Build Coastguard Worker
295*da0073e9SAndroid Build Coastguard Worker- `npps`:
296*da0073e9SAndroid Build Coastguard Worker
297*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::npps``
298*da0073e9SAndroid Build Coastguard Worker  - ``CUDA::npps_static``
299*da0073e9SAndroid Build Coastguard Worker
300*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvBLAS`:
301*da0073e9SAndroid Build Coastguard Worker
302*da0073e9SAndroid Build Coastguard WorkernvBLAS
303*da0073e9SAndroid Build Coastguard Worker""""""
304*da0073e9SAndroid Build Coastguard Worker
305*da0073e9SAndroid Build Coastguard WorkerThe `nvBLAS <https://docs.nvidia.com/cuda/nvblas/index.html>`_ libraries.
306*da0073e9SAndroid Build Coastguard WorkerThis is a shared library only.
307*da0073e9SAndroid Build Coastguard Worker
308*da0073e9SAndroid Build Coastguard WorkerTargets Created:
309*da0073e9SAndroid Build Coastguard Worker
310*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvblas``
311*da0073e9SAndroid Build Coastguard Worker
312*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvGRAPH`:
313*da0073e9SAndroid Build Coastguard Worker
314*da0073e9SAndroid Build Coastguard WorkernvGRAPH
315*da0073e9SAndroid Build Coastguard Worker"""""""
316*da0073e9SAndroid Build Coastguard Worker
317*da0073e9SAndroid Build Coastguard WorkerThe `nvGRAPH <https://docs.nvidia.com/cuda/nvgraph/index.html>`_ library.
318*da0073e9SAndroid Build Coastguard WorkerRemoved starting in CUDA 11.0
319*da0073e9SAndroid Build Coastguard Worker
320*da0073e9SAndroid Build Coastguard WorkerTargets Created:
321*da0073e9SAndroid Build Coastguard Worker
322*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvgraph``
323*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvgraph_static``
324*da0073e9SAndroid Build Coastguard Worker
325*da0073e9SAndroid Build Coastguard Worker
326*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvJPEG`:
327*da0073e9SAndroid Build Coastguard Worker
328*da0073e9SAndroid Build Coastguard WorkernvJPEG
329*da0073e9SAndroid Build Coastguard Worker""""""
330*da0073e9SAndroid Build Coastguard Worker
331*da0073e9SAndroid Build Coastguard WorkerThe `nvJPEG <https://docs.nvidia.com/cuda/nvjpeg/index.html>`_ library.
332*da0073e9SAndroid Build Coastguard WorkerIntroduced in CUDA 10.
333*da0073e9SAndroid Build Coastguard Worker
334*da0073e9SAndroid Build Coastguard WorkerTargets Created:
335*da0073e9SAndroid Build Coastguard Worker
336*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvjpeg``
337*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvjpeg_static``
338*da0073e9SAndroid Build Coastguard Worker
339*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvRTC`:
340*da0073e9SAndroid Build Coastguard Worker
341*da0073e9SAndroid Build Coastguard WorkernvRTC
342*da0073e9SAndroid Build Coastguard Worker"""""
343*da0073e9SAndroid Build Coastguard Worker
344*da0073e9SAndroid Build Coastguard WorkerThe `nvRTC <https://docs.nvidia.com/cuda/nvrtc/index.html>`_ (Runtime Compilation) library.
345*da0073e9SAndroid Build Coastguard WorkerThis is a shared library only.
346*da0073e9SAndroid Build Coastguard Worker
347*da0073e9SAndroid Build Coastguard WorkerTargets Created:
348*da0073e9SAndroid Build Coastguard Worker
349*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvrtc``
350*da0073e9SAndroid Build Coastguard Worker
351*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvml`:
352*da0073e9SAndroid Build Coastguard Worker
353*da0073e9SAndroid Build Coastguard Workernvidia-ML
354*da0073e9SAndroid Build Coastguard Worker"""""""""
355*da0073e9SAndroid Build Coastguard Worker
356*da0073e9SAndroid Build Coastguard WorkerThe `NVIDIA Management Library <https://developer.nvidia.com/nvidia-management-library-nvml>`_.
357*da0073e9SAndroid Build Coastguard WorkerThis is a shared library only.
358*da0073e9SAndroid Build Coastguard Worker
359*da0073e9SAndroid Build Coastguard WorkerTargets Created:
360*da0073e9SAndroid Build Coastguard Worker
361*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvml``
362*da0073e9SAndroid Build Coastguard Worker
363*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_nvToolsExt`:
364*da0073e9SAndroid Build Coastguard Worker
365*da0073e9SAndroid Build Coastguard WorkernvToolsExt
366*da0073e9SAndroid Build Coastguard Worker""""""""""
367*da0073e9SAndroid Build Coastguard Worker
368*da0073e9SAndroid Build Coastguard WorkerThe `NVIDIA Tools Extension <https://docs.nvidia.com/gameworks/content/gameworkslibrary/nvtx/nvidia_tools_extension_library_nvtx.htm>`_.
369*da0073e9SAndroid Build Coastguard WorkerThis is a shared library only.
370*da0073e9SAndroid Build Coastguard Worker
371*da0073e9SAndroid Build Coastguard WorkerTargets Created:
372*da0073e9SAndroid Build Coastguard Worker
373*da0073e9SAndroid Build Coastguard Worker- ``CUDA::nvToolsExt``
374*da0073e9SAndroid Build Coastguard Worker
375*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_opencl`:
376*da0073e9SAndroid Build Coastguard Worker
377*da0073e9SAndroid Build Coastguard WorkerOpenCL
378*da0073e9SAndroid Build Coastguard Worker""""""
379*da0073e9SAndroid Build Coastguard Worker
380*da0073e9SAndroid Build Coastguard WorkerThe `NVIDIA OpenCL Library <https://developer.nvidia.com/opencl>`_.
381*da0073e9SAndroid Build Coastguard WorkerThis is a shared library only.
382*da0073e9SAndroid Build Coastguard Worker
383*da0073e9SAndroid Build Coastguard WorkerTargets Created:
384*da0073e9SAndroid Build Coastguard Worker
385*da0073e9SAndroid Build Coastguard Worker- ``CUDA::OpenCL``
386*da0073e9SAndroid Build Coastguard Worker
387*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuLIBOS`:
388*da0073e9SAndroid Build Coastguard Worker
389*da0073e9SAndroid Build Coastguard WorkercuLIBOS
390*da0073e9SAndroid Build Coastguard Worker"""""""
391*da0073e9SAndroid Build Coastguard Worker
392*da0073e9SAndroid Build Coastguard WorkerThe cuLIBOS library is a backend thread abstraction layer library which is
393*da0073e9SAndroid Build Coastguard Workerstatic only.  The ``CUDA::cublas_static``, ``CUDA::cusparse_static``,
394*da0073e9SAndroid Build Coastguard Worker``CUDA::cufft_static``, ``CUDA::curand_static``, and (when implemented) NPP
395*da0073e9SAndroid Build Coastguard Workerlibraries all automatically have this dependency linked.
396*da0073e9SAndroid Build Coastguard Worker
397*da0073e9SAndroid Build Coastguard WorkerTarget Created:
398*da0073e9SAndroid Build Coastguard Worker
399*da0073e9SAndroid Build Coastguard Worker- ``CUDA::culibos``
400*da0073e9SAndroid Build Coastguard Worker
401*da0073e9SAndroid Build Coastguard Worker**Note**: direct usage of this target by consumers should not be necessary.
402*da0073e9SAndroid Build Coastguard Worker
403*da0073e9SAndroid Build Coastguard Worker.. _`cuda_toolkit_cuRAND`:
404*da0073e9SAndroid Build Coastguard Worker
405*da0073e9SAndroid Build Coastguard Worker
406*da0073e9SAndroid Build Coastguard Worker
407*da0073e9SAndroid Build Coastguard WorkerResult variables
408*da0073e9SAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^
409*da0073e9SAndroid Build Coastguard Worker
410*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_FOUND``
411*da0073e9SAndroid Build Coastguard Worker    A boolean specifying whether or not the CUDA Toolkit was found.
412*da0073e9SAndroid Build Coastguard Worker
413*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_VERSION``
414*da0073e9SAndroid Build Coastguard Worker    The exact version of the CUDA Toolkit found (as reported by
415*da0073e9SAndroid Build Coastguard Worker    ``nvcc --version`` or ``version.txt``).
416*da0073e9SAndroid Build Coastguard Worker
417*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_VERSION_MAJOR``
418*da0073e9SAndroid Build Coastguard Worker    The major version of the CUDA Toolkit.
419*da0073e9SAndroid Build Coastguard Worker
420*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_VERSION_MINOR``
421*da0073e9SAndroid Build Coastguard Worker    The minor version of the CUDA Toolkit.
422*da0073e9SAndroid Build Coastguard Worker
423*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_VERSION_PATCH``
424*da0073e9SAndroid Build Coastguard Worker    The patch version of the CUDA Toolkit.
425*da0073e9SAndroid Build Coastguard Worker
426*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_BIN_DIR``
427*da0073e9SAndroid Build Coastguard Worker    The path to the CUDA Toolkit library directory that contains the CUDA
428*da0073e9SAndroid Build Coastguard Worker    executable ``nvcc``.
429*da0073e9SAndroid Build Coastguard Worker
430*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_INCLUDE_DIRS``
431*da0073e9SAndroid Build Coastguard Worker    The path to the CUDA Toolkit ``include`` folder containing the header files
432*da0073e9SAndroid Build Coastguard Worker    required to compile a project linking against CUDA.
433*da0073e9SAndroid Build Coastguard Worker
434*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_LIBRARY_DIR``
435*da0073e9SAndroid Build Coastguard Worker    The path to the CUDA Toolkit library directory that contains the CUDA
436*da0073e9SAndroid Build Coastguard Worker    Runtime library ``cudart``.
437*da0073e9SAndroid Build Coastguard Worker
438*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_LIBRARY_ROOT``
439*da0073e9SAndroid Build Coastguard Worker    .. versionadded:: 3.18
440*da0073e9SAndroid Build Coastguard Worker
441*da0073e9SAndroid Build Coastguard Worker    The path to the CUDA Toolkit directory containing the nvvm directory and
442*da0073e9SAndroid Build Coastguard Worker    version.txt.
443*da0073e9SAndroid Build Coastguard Worker
444*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_TARGET_DIR``
445*da0073e9SAndroid Build Coastguard Worker    The path to the CUDA Toolkit directory including the target architecture
446*da0073e9SAndroid Build Coastguard Worker    when cross-compiling. When not cross-compiling this will be equivalent to
447*da0073e9SAndroid Build Coastguard Worker    the parent directory of ``CUDAToolkit_BIN_DIR``.
448*da0073e9SAndroid Build Coastguard Worker
449*da0073e9SAndroid Build Coastguard Worker``CUDAToolkit_NVCC_EXECUTABLE``
450*da0073e9SAndroid Build Coastguard Worker    The path to the NVIDIA CUDA compiler ``nvcc``.  Note that this path may
451*da0073e9SAndroid Build Coastguard Worker    **not** be the same as
452*da0073e9SAndroid Build Coastguard Worker    :variable:`CMAKE_CUDA_COMPILER <CMAKE_<LANG>_COMPILER>`.  ``nvcc`` must be
453*da0073e9SAndroid Build Coastguard Worker    found to determine the CUDA Toolkit version as well as determining other
454*da0073e9SAndroid Build Coastguard Worker    features of the Toolkit.  This variable is set for the convenience of
455*da0073e9SAndroid Build Coastguard Worker    modules that depend on this one.
456*da0073e9SAndroid Build Coastguard Worker
457*da0073e9SAndroid Build Coastguard Worker
458*da0073e9SAndroid Build Coastguard Worker#]=======================================================================]
459*da0073e9SAndroid Build Coastguard Worker
460*da0073e9SAndroid Build Coastguard Worker# NOTE: much of this was simply extracted from FindCUDA.cmake.
461*da0073e9SAndroid Build Coastguard Worker
462*da0073e9SAndroid Build Coastguard Worker#   James Bigler, NVIDIA Corp (nvidia.com - jbigler)
463*da0073e9SAndroid Build Coastguard Worker#   Abe Stephens, SCI Institute -- http://www.sci.utah.edu/~abe/FindCuda.html
464*da0073e9SAndroid Build Coastguard Worker#
465*da0073e9SAndroid Build Coastguard Worker#   Copyright (c) 2008 - 2009 NVIDIA Corporation.  All rights reserved.
466*da0073e9SAndroid Build Coastguard Worker#
467*da0073e9SAndroid Build Coastguard Worker#   Copyright (c) 2007-2009
468*da0073e9SAndroid Build Coastguard Worker#   Scientific Computing and Imaging Institute, University of Utah
469*da0073e9SAndroid Build Coastguard Worker#
470*da0073e9SAndroid Build Coastguard Worker#   This code is licensed under the MIT License.  See the FindCUDA.cmake script
471*da0073e9SAndroid Build Coastguard Worker#   for the text of the license.
472*da0073e9SAndroid Build Coastguard Worker
473*da0073e9SAndroid Build Coastguard Worker# The MIT License
474*da0073e9SAndroid Build Coastguard Worker#
475*da0073e9SAndroid Build Coastguard Worker# License for the specific language governing rights and limitations under
476*da0073e9SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
477*da0073e9SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
478*da0073e9SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
479*da0073e9SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
480*da0073e9SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
481*da0073e9SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions:
482*da0073e9SAndroid Build Coastguard Worker#
483*da0073e9SAndroid Build Coastguard Worker# The above copyright notice and this permission notice shall be included
484*da0073e9SAndroid Build Coastguard Worker# in all copies or substantial portions of the Software.
485*da0073e9SAndroid Build Coastguard Worker#
486*da0073e9SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
487*da0073e9SAndroid Build Coastguard Worker# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
488*da0073e9SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
489*da0073e9SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
490*da0073e9SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
491*da0073e9SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
492*da0073e9SAndroid Build Coastguard Worker# DEALINGS IN THE SOFTWARE.
493*da0073e9SAndroid Build Coastguard Worker#
494*da0073e9SAndroid Build Coastguard Worker###############################################################################
495*da0073e9SAndroid Build Coastguard Worker
496*da0073e9SAndroid Build Coastguard Worker# The toolkit is located during compiler detection for CUDA and stored in CMakeCUDACompiler.cmake as
497*da0073e9SAndroid Build Coastguard Worker# CMAKE_CUDA_COMPILER_TOOLKIT_ROOT and CMAKE_CUDA_COMPILER_LIBRARY_ROOT.
498*da0073e9SAndroid Build Coastguard Worker# We compute the rest based on those here to avoid re-searching and to avoid finding a possibly
499*da0073e9SAndroid Build Coastguard Worker# different installation.
500*da0073e9SAndroid Build Coastguard Workerif(CMAKE_CUDA_COMPILER_TOOLKIT_ROOT)
501*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_ROOT_DIR "${CMAKE_CUDA_COMPILER_TOOLKIT_ROOT}")
502*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_LIBRARY_ROOT "${CMAKE_CUDA_COMPILER_LIBRARY_ROOT}")
503*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_VERSION "${CMAKE_CUDA_COMPILER_TOOLKIT_VERSION}")
504*da0073e9SAndroid Build Coastguard Worker
505*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION MATCHES [=[([0-9]+)\.([0-9]+)\.([0-9]+)]=])
506*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_VERSION_MAJOR "${CMAKE_MATCH_1}")
507*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_VERSION_MINOR "${CMAKE_MATCH_2}")
508*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_VERSION_PATCH "${CMAKE_MATCH_3}")
509*da0073e9SAndroid Build Coastguard Worker  endif()
510*da0073e9SAndroid Build Coastguard Workerelse()
511*da0073e9SAndroid Build Coastguard Worker  function(_CUDAToolkit_find_root_dir )
512*da0073e9SAndroid Build Coastguard Worker    cmake_parse_arguments(arg "" "" "SEARCH_PATHS;FIND_FLAGS" ${ARGN})
513*da0073e9SAndroid Build Coastguard Worker
514*da0073e9SAndroid Build Coastguard Worker    if(NOT CUDAToolkit_BIN_DIR)
515*da0073e9SAndroid Build Coastguard Worker      if(NOT CUDAToolkit_SENTINEL_FILE)
516*da0073e9SAndroid Build Coastguard Worker        find_program(CUDAToolkit_NVCC_EXECUTABLE
517*da0073e9SAndroid Build Coastguard Worker          NAMES nvcc nvcc.exe
518*da0073e9SAndroid Build Coastguard Worker          PATHS ${arg_SEARCH_PATHS}
519*da0073e9SAndroid Build Coastguard Worker          ${arg_FIND_FLAGS}
520*da0073e9SAndroid Build Coastguard Worker        )
521*da0073e9SAndroid Build Coastguard Worker      endif()
522*da0073e9SAndroid Build Coastguard Worker
523*da0073e9SAndroid Build Coastguard Worker      if(NOT CUDAToolkit_NVCC_EXECUTABLE)
524*da0073e9SAndroid Build Coastguard Worker        find_file(CUDAToolkit_SENTINEL_FILE
525*da0073e9SAndroid Build Coastguard Worker          NAMES version.txt
526*da0073e9SAndroid Build Coastguard Worker          PATHS ${arg_SEARCH_PATHS}
527*da0073e9SAndroid Build Coastguard Worker          NO_DEFAULT_PATH
528*da0073e9SAndroid Build Coastguard Worker        )
529*da0073e9SAndroid Build Coastguard Worker      endif()
530*da0073e9SAndroid Build Coastguard Worker
531*da0073e9SAndroid Build Coastguard Worker      if(EXISTS "${CUDAToolkit_NVCC_EXECUTABLE}")
532*da0073e9SAndroid Build Coastguard Worker        # If NVCC exists  then invoke it to find the toolkit location.
533*da0073e9SAndroid Build Coastguard Worker        # This allows us to support wrapper scripts (e.g. ccache or colornvcc), CUDA Toolkit,
534*da0073e9SAndroid Build Coastguard Worker        # NVIDIA HPC SDK, and distro's splayed layouts
535*da0073e9SAndroid Build Coastguard Worker        execute_process(COMMAND ${CUDAToolkit_NVCC_EXECUTABLE} "-v" "__cmake_determine_cuda"
536*da0073e9SAndroid Build Coastguard Worker          OUTPUT_VARIABLE _CUDA_NVCC_OUT ERROR_VARIABLE _CUDA_NVCC_OUT)
537*da0073e9SAndroid Build Coastguard Worker        if(_CUDA_NVCC_OUT MATCHES "\\#\\$ TOP=([^\r\n]*)")
538*da0073e9SAndroid Build Coastguard Worker          get_filename_component(CUDAToolkit_BIN_DIR "${CMAKE_MATCH_1}/bin" ABSOLUTE)
539*da0073e9SAndroid Build Coastguard Worker        else()
540*da0073e9SAndroid Build Coastguard Worker          get_filename_component(CUDAToolkit_BIN_DIR "${CUDAToolkit_NVCC_EXECUTABLE}" DIRECTORY)
541*da0073e9SAndroid Build Coastguard Worker        endif()
542*da0073e9SAndroid Build Coastguard Worker        unset(_CUDA_NVCC_OUT)
543*da0073e9SAndroid Build Coastguard Worker
544*da0073e9SAndroid Build Coastguard Worker        mark_as_advanced(CUDAToolkit_BIN_DIR)
545*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_BIN_DIR "${CUDAToolkit_BIN_DIR}" CACHE PATH "" FORCE)
546*da0073e9SAndroid Build Coastguard Worker      endif()
547*da0073e9SAndroid Build Coastguard Worker
548*da0073e9SAndroid Build Coastguard Worker      if(CUDAToolkit_SENTINEL_FILE)
549*da0073e9SAndroid Build Coastguard Worker        get_filename_component(CUDAToolkit_BIN_DIR ${CUDAToolkit_SENTINEL_FILE} DIRECTORY ABSOLUTE)
550*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_BIN_DIR "${CUDAToolkit_BIN_DIR}/bin")
551*da0073e9SAndroid Build Coastguard Worker
552*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_BIN_DIR "${CUDAToolkit_BIN_DIR}" CACHE PATH "" FORCE)
553*da0073e9SAndroid Build Coastguard Worker        mark_as_advanced(CUDAToolkit_BIN_DIR)
554*da0073e9SAndroid Build Coastguard Worker      endif()
555*da0073e9SAndroid Build Coastguard Worker    endif()
556*da0073e9SAndroid Build Coastguard Worker
557*da0073e9SAndroid Build Coastguard Worker    if(CUDAToolkit_BIN_DIR)
558*da0073e9SAndroid Build Coastguard Worker      get_filename_component(CUDAToolkit_ROOT_DIR ${CUDAToolkit_BIN_DIR} DIRECTORY ABSOLUTE)
559*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_ROOT_DIR "${CUDAToolkit_ROOT_DIR}" PARENT_SCOPE)
560*da0073e9SAndroid Build Coastguard Worker    endif()
561*da0073e9SAndroid Build Coastguard Worker
562*da0073e9SAndroid Build Coastguard Worker  endfunction()
563*da0073e9SAndroid Build Coastguard Worker
564*da0073e9SAndroid Build Coastguard Worker  # For NVCC we can easily deduce the SDK binary directory from the compiler path.
565*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_CUDA_COMPILER_LOADED AND NOT CUDAToolkit_BIN_DIR AND CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
566*da0073e9SAndroid Build Coastguard Worker    get_filename_component(CUDAToolkit_BIN_DIR "${CMAKE_CUDA_COMPILER}" DIRECTORY)
567*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_BIN_DIR "${CUDAToolkit_BIN_DIR}" CACHE PATH "")
568*da0073e9SAndroid Build Coastguard Worker    # Try language provided path first.
569*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_root_dir(SEARCH_PATHS "${CUDAToolkit_BIN_DIR}" FIND_FLAGS NO_DEFAULT_PATH)
570*da0073e9SAndroid Build Coastguard Worker    mark_as_advanced(CUDAToolkit_BIN_DIR)
571*da0073e9SAndroid Build Coastguard Worker  endif()
572*da0073e9SAndroid Build Coastguard Worker
573*da0073e9SAndroid Build Coastguard Worker  # Try user provided path
574*da0073e9SAndroid Build Coastguard Worker  if(NOT CUDAToolkit_ROOT_DIR AND CUDAToolkit_ROOT)
575*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_root_dir(SEARCH_PATHS "${CUDAToolkit_ROOT}" FIND_FLAGS PATH_SUFFIXES bin NO_DEFAULT_PATH)
576*da0073e9SAndroid Build Coastguard Worker  endif()
577*da0073e9SAndroid Build Coastguard Worker  if(NOT CUDAToolkit_ROOT_DIR)
578*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_root_dir(FIND_FLAGS PATHS ENV CUDA_PATH PATH_SUFFIXES bin)
579*da0073e9SAndroid Build Coastguard Worker  endif()
580*da0073e9SAndroid Build Coastguard Worker
581*da0073e9SAndroid Build Coastguard Worker  # If the user specified CUDAToolkit_ROOT but the toolkit could not be found, this is an error.
582*da0073e9SAndroid Build Coastguard Worker  if(NOT CUDAToolkit_ROOT_DIR AND (DEFINED CUDAToolkit_ROOT OR DEFINED ENV{CUDAToolkit_ROOT}))
583*da0073e9SAndroid Build Coastguard Worker    # Declare error messages now, print later depending on find_package args.
584*da0073e9SAndroid Build Coastguard Worker    set(fail_base "Could not find nvcc executable in path specified by")
585*da0073e9SAndroid Build Coastguard Worker    set(cuda_root_fail "${fail_base} CUDAToolkit_ROOT=${CUDAToolkit_ROOT}")
586*da0073e9SAndroid Build Coastguard Worker    set(env_cuda_root_fail "${fail_base} environment variable CUDAToolkit_ROOT=$ENV{CUDAToolkit_ROOT}")
587*da0073e9SAndroid Build Coastguard Worker
588*da0073e9SAndroid Build Coastguard Worker    if(CUDAToolkit_FIND_REQUIRED)
589*da0073e9SAndroid Build Coastguard Worker      if(DEFINED CUDAToolkit_ROOT)
590*da0073e9SAndroid Build Coastguard Worker        message(FATAL_ERROR ${cuda_root_fail})
591*da0073e9SAndroid Build Coastguard Worker      elseif(DEFINED ENV{CUDAToolkit_ROOT})
592*da0073e9SAndroid Build Coastguard Worker        message(FATAL_ERROR ${env_cuda_root_fail})
593*da0073e9SAndroid Build Coastguard Worker      endif()
594*da0073e9SAndroid Build Coastguard Worker    else()
595*da0073e9SAndroid Build Coastguard Worker      if(NOT CUDAToolkit_FIND_QUIETLY)
596*da0073e9SAndroid Build Coastguard Worker        if(DEFINED CUDAToolkit_ROOT)
597*da0073e9SAndroid Build Coastguard Worker          message(STATUS ${cuda_root_fail})
598*da0073e9SAndroid Build Coastguard Worker        elseif(DEFINED ENV{CUDAToolkit_ROOT})
599*da0073e9SAndroid Build Coastguard Worker          message(STATUS ${env_cuda_root_fail})
600*da0073e9SAndroid Build Coastguard Worker        endif()
601*da0073e9SAndroid Build Coastguard Worker      endif()
602*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_FOUND FALSE)
603*da0073e9SAndroid Build Coastguard Worker      unset(fail_base)
604*da0073e9SAndroid Build Coastguard Worker      unset(cuda_root_fail)
605*da0073e9SAndroid Build Coastguard Worker      unset(env_cuda_root_fail)
606*da0073e9SAndroid Build Coastguard Worker      return()
607*da0073e9SAndroid Build Coastguard Worker    endif()
608*da0073e9SAndroid Build Coastguard Worker  endif()
609*da0073e9SAndroid Build Coastguard Worker
610*da0073e9SAndroid Build Coastguard Worker  # CUDAToolkit_ROOT cmake / env variable not specified, try platform defaults.
611*da0073e9SAndroid Build Coastguard Worker  #
612*da0073e9SAndroid Build Coastguard Worker  # - Linux: /usr/local/cuda-X.Y
613*da0073e9SAndroid Build Coastguard Worker  # - macOS: /Developer/NVIDIA/CUDA-X.Y
614*da0073e9SAndroid Build Coastguard Worker  # - Windows: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vX.Y
615*da0073e9SAndroid Build Coastguard Worker  #
616*da0073e9SAndroid Build Coastguard Worker  # We will also search the default symlink location /usr/local/cuda first since
617*da0073e9SAndroid Build Coastguard Worker  # if CUDAToolkit_ROOT is not specified, it is assumed that the symlinked
618*da0073e9SAndroid Build Coastguard Worker  # directory is the desired location.
619*da0073e9SAndroid Build Coastguard Worker  if(NOT CUDAToolkit_ROOT_DIR)
620*da0073e9SAndroid Build Coastguard Worker    if(UNIX)
621*da0073e9SAndroid Build Coastguard Worker      if(NOT APPLE)
622*da0073e9SAndroid Build Coastguard Worker        set(platform_base "/usr/local/cuda-")
623*da0073e9SAndroid Build Coastguard Worker      else()
624*da0073e9SAndroid Build Coastguard Worker        set(platform_base "/Developer/NVIDIA/CUDA-")
625*da0073e9SAndroid Build Coastguard Worker      endif()
626*da0073e9SAndroid Build Coastguard Worker    else()
627*da0073e9SAndroid Build Coastguard Worker      set(platform_base "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v")
628*da0073e9SAndroid Build Coastguard Worker    endif()
629*da0073e9SAndroid Build Coastguard Worker
630*da0073e9SAndroid Build Coastguard Worker    # Build out a descending list of possible cuda installations, e.g.
631*da0073e9SAndroid Build Coastguard Worker    file(GLOB possible_paths "${platform_base}*")
632*da0073e9SAndroid Build Coastguard Worker    # Iterate the glob results and create a descending list.
633*da0073e9SAndroid Build Coastguard Worker    set(versions)
634*da0073e9SAndroid Build Coastguard Worker    foreach(p ${possible_paths})
635*da0073e9SAndroid Build Coastguard Worker      # Extract version number from end of string
636*da0073e9SAndroid Build Coastguard Worker      string(REGEX MATCH "[0-9][0-9]?\\.[0-9]$" p_version ${p})
637*da0073e9SAndroid Build Coastguard Worker      if(IS_DIRECTORY ${p} AND p_version)
638*da0073e9SAndroid Build Coastguard Worker        list(APPEND versions ${p_version})
639*da0073e9SAndroid Build Coastguard Worker      endif()
640*da0073e9SAndroid Build Coastguard Worker    endforeach()
641*da0073e9SAndroid Build Coastguard Worker
642*da0073e9SAndroid Build Coastguard Worker    # Sort numerically in descending order, so we try the newest versions first.
643*da0073e9SAndroid Build Coastguard Worker    if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.18)
644*da0073e9SAndroid Build Coastguard Worker      list(SORT versions COMPARE NATURAL ORDER DESCENDING)
645*da0073e9SAndroid Build Coastguard Worker    elseif(versions)
646*da0073e9SAndroid Build Coastguard Worker      # Alphabetical sort here is not ideal but better than nothing
647*da0073e9SAndroid Build Coastguard Worker      list(SORT versions)
648*da0073e9SAndroid Build Coastguard Worker      list(REVERSE versions)
649*da0073e9SAndroid Build Coastguard Worker    endif()
650*da0073e9SAndroid Build Coastguard Worker
651*da0073e9SAndroid Build Coastguard Worker    # With a descending list of versions, populate possible paths to search.
652*da0073e9SAndroid Build Coastguard Worker    set(search_paths)
653*da0073e9SAndroid Build Coastguard Worker    foreach(v ${versions})
654*da0073e9SAndroid Build Coastguard Worker      list(APPEND search_paths "${platform_base}${v}")
655*da0073e9SAndroid Build Coastguard Worker    endforeach()
656*da0073e9SAndroid Build Coastguard Worker
657*da0073e9SAndroid Build Coastguard Worker    # Force the global default /usr/local/cuda to the front on Unix.
658*da0073e9SAndroid Build Coastguard Worker    if(UNIX)
659*da0073e9SAndroid Build Coastguard Worker      list(INSERT search_paths 0 "/usr/local/cuda")
660*da0073e9SAndroid Build Coastguard Worker    endif()
661*da0073e9SAndroid Build Coastguard Worker
662*da0073e9SAndroid Build Coastguard Worker    # Now search for the toolkit again using the platform default search paths.
663*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_root_dir(SEARCH_PATHS "${search_paths}" FIND_FLAGS PATH_SUFFIXES bin)
664*da0073e9SAndroid Build Coastguard Worker
665*da0073e9SAndroid Build Coastguard Worker    # We are done with these variables now, cleanup for caller.
666*da0073e9SAndroid Build Coastguard Worker    unset(platform_base)
667*da0073e9SAndroid Build Coastguard Worker    unset(possible_paths)
668*da0073e9SAndroid Build Coastguard Worker    unset(versions)
669*da0073e9SAndroid Build Coastguard Worker    unset(search_paths)
670*da0073e9SAndroid Build Coastguard Worker
671*da0073e9SAndroid Build Coastguard Worker    if(NOT CUDAToolkit_ROOT_DIR)
672*da0073e9SAndroid Build Coastguard Worker      if(CUDAToolkit_FIND_REQUIRED)
673*da0073e9SAndroid Build Coastguard Worker        message(FATAL_ERROR "Could not find nvcc, please set CUDAToolkit_ROOT.")
674*da0073e9SAndroid Build Coastguard Worker      elseif(NOT CUDAToolkit_FIND_QUIETLY)
675*da0073e9SAndroid Build Coastguard Worker        message(STATUS "Could not find nvcc, please set CUDAToolkit_ROOT.")
676*da0073e9SAndroid Build Coastguard Worker      endif()
677*da0073e9SAndroid Build Coastguard Worker
678*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_FOUND FALSE)
679*da0073e9SAndroid Build Coastguard Worker      return()
680*da0073e9SAndroid Build Coastguard Worker    endif()
681*da0073e9SAndroid Build Coastguard Worker  endif()
682*da0073e9SAndroid Build Coastguard Workerendif()
683*da0073e9SAndroid Build Coastguard Worker
684*da0073e9SAndroid Build Coastguard Workerif(NOT CUDAToolkit_BIN_DIR)
685*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_BIN_DIR "${CUDAToolkit_ROOT_DIR}/bin")
686*da0073e9SAndroid Build Coastguard Workerendif()
687*da0073e9SAndroid Build Coastguard Worker
688*da0073e9SAndroid Build Coastguard Workerif(NOT CUDAToolkit_NVCC_EXECUTABLE)
689*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_NVCC_EXECUTABLE "${CUDAToolkit_BIN_DIR}/nvcc${CMAKE_EXECUTABLE_SUFFIX}")
690*da0073e9SAndroid Build Coastguard Workerendif()
691*da0073e9SAndroid Build Coastguard Worker
692*da0073e9SAndroid Build Coastguard Workerif(CMAKE_CUDA_COMPILER_TOOLKIT_VERSION)
693*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_VERSION "${CMAKE_CUDA_COMPILER_TOOLKIT_VERSION}")
694*da0073e9SAndroid Build Coastguard Workerelse()
695*da0073e9SAndroid Build Coastguard Worker  function(_CUDAToolkit_find_version_file result_variable)
696*da0073e9SAndroid Build Coastguard Worker    # We first check for a non-scattered installation to prefer it over a scattered installation.
697*da0073e9SAndroid Build Coastguard Worker    if(CUDAToolkit_ROOT AND EXISTS "${CUDAToolkit_ROOT}/version.txt")
698*da0073e9SAndroid Build Coastguard Worker      set(${result_variable} "${CUDAToolkit_ROOT}/version.txt" PARENT_SCOPE)
699*da0073e9SAndroid Build Coastguard Worker    elseif(CUDAToolkit_ROOT_DIR AND EXISTS "${CUDAToolkit_ROOT_DIR}/version.txt")
700*da0073e9SAndroid Build Coastguard Worker      set(${result_variable} "${CUDAToolkit_ROOT_DIR}/version.txt" PARENT_SCOPE)
701*da0073e9SAndroid Build Coastguard Worker    elseif(CMAKE_SYSROOT_LINK AND EXISTS "${CMAKE_SYSROOT_LINK}/usr/lib/cuda/version.txt")
702*da0073e9SAndroid Build Coastguard Worker      set(${result_variable} "${CMAKE_SYSROOT_LINK}/usr/lib/cuda/version.txt" PARENT_SCOPE)
703*da0073e9SAndroid Build Coastguard Worker    elseif(EXISTS "${CMAKE_SYSROOT}/usr/lib/cuda/version.txt")
704*da0073e9SAndroid Build Coastguard Worker      set(${result_variable} "${CMAKE_SYSROOT}/usr/lib/cuda/version.txt" PARENT_SCOPE)
705*da0073e9SAndroid Build Coastguard Worker    endif()
706*da0073e9SAndroid Build Coastguard Worker  endfunction()
707*da0073e9SAndroid Build Coastguard Worker
708*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_version_file( _CUDAToolkit_version_file )
709*da0073e9SAndroid Build Coastguard Worker  if(_CUDAToolkit_version_file)
710*da0073e9SAndroid Build Coastguard Worker    # CUDAToolkit_LIBRARY_ROOT contains the device library and version file.
711*da0073e9SAndroid Build Coastguard Worker    get_filename_component(CUDAToolkit_LIBRARY_ROOT "${_CUDAToolkit_version_file}" DIRECTORY ABSOLUTE)
712*da0073e9SAndroid Build Coastguard Worker  endif()
713*da0073e9SAndroid Build Coastguard Worker  unset(_CUDAToolkit_version_file)
714*da0073e9SAndroid Build Coastguard Worker
715*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_NVCC_EXECUTABLE AND
716*da0073e9SAndroid Build Coastguard Worker     CMAKE_CUDA_COMPILER_VERSION AND
717*da0073e9SAndroid Build Coastguard Worker     CUDAToolkit_NVCC_EXECUTABLE STREQUAL CMAKE_CUDA_COMPILER)
718*da0073e9SAndroid Build Coastguard Worker    # Need to set these based off the already computed CMAKE_CUDA_COMPILER_VERSION value
719*da0073e9SAndroid Build Coastguard Worker    # This if statement will always match, but is used to provide variables for MATCH 1,2,3...
720*da0073e9SAndroid Build Coastguard Worker    if(CMAKE_CUDA_COMPILER_VERSION MATCHES [=[([0-9]+)\.([0-9]+)\.([0-9]+)]=])
721*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_MAJOR "${CMAKE_MATCH_1}")
722*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_MINOR "${CMAKE_MATCH_2}")
723*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_PATCH "${CMAKE_MATCH_3}")
724*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION "${CMAKE_CUDA_COMPILER_VERSION}")
725*da0073e9SAndroid Build Coastguard Worker    endif()
726*da0073e9SAndroid Build Coastguard Worker  elseif(CUDAToolkit_NVCC_EXECUTABLE)
727*da0073e9SAndroid Build Coastguard Worker    # Compute the version by invoking nvcc
728*da0073e9SAndroid Build Coastguard Worker    execute_process(COMMAND ${CUDAToolkit_NVCC_EXECUTABLE} "--version" OUTPUT_VARIABLE NVCC_OUT)
729*da0073e9SAndroid Build Coastguard Worker    if(NVCC_OUT MATCHES [=[ V([0-9]+)\.([0-9]+)\.([0-9]+)]=])
730*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_MAJOR "${CMAKE_MATCH_1}")
731*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_MINOR "${CMAKE_MATCH_2}")
732*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION_PATCH "${CMAKE_MATCH_3}")
733*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
734*da0073e9SAndroid Build Coastguard Worker    endif()
735*da0073e9SAndroid Build Coastguard Worker    unset(NVCC_OUT)
736*da0073e9SAndroid Build Coastguard Worker  else()
737*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_version_file(version_file)
738*da0073e9SAndroid Build Coastguard Worker    if(version_file)
739*da0073e9SAndroid Build Coastguard Worker      file(READ "${version_file}" VERSION_INFO)
740*da0073e9SAndroid Build Coastguard Worker      if(VERSION_INFO MATCHES [=[CUDA Version ([0-9]+)\.([0-9]+)\.([0-9]+)]=])
741*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_VERSION_MAJOR "${CMAKE_MATCH_1}")
742*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_VERSION_MINOR "${CMAKE_MATCH_2}")
743*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_VERSION_PATCH "${CMAKE_MATCH_3}")
744*da0073e9SAndroid Build Coastguard Worker        set(CUDAToolkit_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
745*da0073e9SAndroid Build Coastguard Worker      endif()
746*da0073e9SAndroid Build Coastguard Worker    endif()
747*da0073e9SAndroid Build Coastguard Worker  endif()
748*da0073e9SAndroid Build Coastguard Workerendif()
749*da0073e9SAndroid Build Coastguard Worker
750*da0073e9SAndroid Build Coastguard Worker# Find target directory when crosscompiling.
751*da0073e9SAndroid Build Coastguard Workerif(CMAKE_CROSSCOMPILING)
752*da0073e9SAndroid Build Coastguard Worker  if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
753*da0073e9SAndroid Build Coastguard Worker    # Support for NVPACK
754*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_TARGET_NAME "armv7-linux-androideabi")
755*da0073e9SAndroid Build Coastguard Worker  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
756*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_TARGET_NAME "armv7-linux-gnueabihf")
757*da0073e9SAndroid Build Coastguard Worker  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
758*da0073e9SAndroid Build Coastguard Worker    if(ANDROID_ARCH_NAME STREQUAL "arm64")
759*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_TARGET_NAME "aarch64-linux-androideabi")
760*da0073e9SAndroid Build Coastguard Worker    elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX")
761*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_TARGET_NAME "aarch64-qnx")
762*da0073e9SAndroid Build Coastguard Worker    else()
763*da0073e9SAndroid Build Coastguard Worker      set(CUDAToolkit_TARGET_NAME "aarch64-linux")
764*da0073e9SAndroid Build Coastguard Worker    endif(ANDROID_ARCH_NAME STREQUAL "arm64")
765*da0073e9SAndroid Build Coastguard Worker  elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
766*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_TARGET_NAME "x86_64-linux")
767*da0073e9SAndroid Build Coastguard Worker  endif()
768*da0073e9SAndroid Build Coastguard Worker
769*da0073e9SAndroid Build Coastguard Worker  if(EXISTS "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
770*da0073e9SAndroid Build Coastguard Worker    set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")
771*da0073e9SAndroid Build Coastguard Worker    # add known CUDA target root path to the set of directories we search for programs, libraries and headers
772*da0073e9SAndroid Build Coastguard Worker    list(PREPEND CMAKE_FIND_ROOT_PATH "${CUDAToolkit_TARGET_DIR}")
773*da0073e9SAndroid Build Coastguard Worker
774*da0073e9SAndroid Build Coastguard Worker    # Mark that we need to pop the root search path changes after we have
775*da0073e9SAndroid Build Coastguard Worker    # found all cuda libraries so that searches for our cross-compilation
776*da0073e9SAndroid Build Coastguard Worker    # libraries work when another cuda sdk is in CMAKE_PREFIX_PATH or
777*da0073e9SAndroid Build Coastguard Worker    # PATh
778*da0073e9SAndroid Build Coastguard Worker    set(_CUDAToolkit_Pop_ROOT_PATH True)
779*da0073e9SAndroid Build Coastguard Worker  endif()
780*da0073e9SAndroid Build Coastguard Workerendif()
781*da0073e9SAndroid Build Coastguard Worker
782*da0073e9SAndroid Build Coastguard Worker# If not already set we can simply use the toolkit root or it's a scattered installation.
783*da0073e9SAndroid Build Coastguard Workerif(NOT CUDAToolkit_TARGET_DIR)
784*da0073e9SAndroid Build Coastguard Worker  # Not cross compiling
785*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_TARGET_DIR "${CUDAToolkit_ROOT_DIR}")
786*da0073e9SAndroid Build Coastguard Worker  # Now that we have the real ROOT_DIR, find components inside it.
787*da0073e9SAndroid Build Coastguard Worker  list(APPEND CMAKE_PREFIX_PATH ${CUDAToolkit_ROOT_DIR})
788*da0073e9SAndroid Build Coastguard Worker
789*da0073e9SAndroid Build Coastguard Worker  # Mark that we need to pop the prefix path changes after we have
790*da0073e9SAndroid Build Coastguard Worker  # found the cudart library.
791*da0073e9SAndroid Build Coastguard Worker  set(_CUDAToolkit_Pop_Prefix True)
792*da0073e9SAndroid Build Coastguard Workerendif()
793*da0073e9SAndroid Build Coastguard Worker
794*da0073e9SAndroid Build Coastguard Worker# CUDAToolkit_TARGET_DIR always points to the directory containing the include directory.
795*da0073e9SAndroid Build Coastguard Worker# On a scattered installation /usr, on a non-scattered something like /usr/local/cuda or /usr/local/cuda-10.2/targets/aarch64-linux.
796*da0073e9SAndroid Build Coastguard Workerif(EXISTS "${CUDAToolkit_TARGET_DIR}/include/cuda_runtime.h")
797*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_INCLUDE_DIR "${CUDAToolkit_TARGET_DIR}/include")
798*da0073e9SAndroid Build Coastguard Workerelseif(NOT CUDAToolkit_FIND_QUIETLY)
799*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Unable to find cuda_runtime.h in \"${CUDAToolkit_TARGET_DIR}/include\" for CUDAToolkit_INCLUDE_DIR.")
800*da0073e9SAndroid Build Coastguard Workerendif()
801*da0073e9SAndroid Build Coastguard Worker
802*da0073e9SAndroid Build Coastguard Worker# The NVHPC layout moves math library headers and libraries to a sibling directory.
803*da0073e9SAndroid Build Coastguard Worker# Create a separate variable so this directory can be selectively added to math targets.
804*da0073e9SAndroid Build Coastguard Workerif(NOT EXISTS "${CUDAToolkit_INCLUDE_DIR}/cublas_v2.h")
805*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_MATH_INCLUDE_DIR "${CUDAToolkit_TARGET_DIR}/../../math_libs/include")
806*da0073e9SAndroid Build Coastguard Worker  get_filename_component(CUDAToolkit_MATH_INCLUDE_DIR "${CUDAToolkit_MATH_INCLUDE_DIR}" ABSOLUTE)
807*da0073e9SAndroid Build Coastguard Worker  if(NOT EXISTS "${CUDAToolkit_MATH_INCLUDE_DIR}/cublas_v2.h")
808*da0073e9SAndroid Build Coastguard Worker    if(NOT CUDAToolkit_FIND_QUIETLY)
809*da0073e9SAndroid Build Coastguard Worker      message(STATUS "Unable to find cublas_v2.h in either \"${CUDAToolkit_INCLUDE_DIR}\" or \"${CUDAToolkit_MATH_INCLUDE_DIR}\"")
810*da0073e9SAndroid Build Coastguard Worker    endif()
811*da0073e9SAndroid Build Coastguard Worker    unset(CUDAToolkit_MATH_INCLUDE_DIR)
812*da0073e9SAndroid Build Coastguard Worker  endif()
813*da0073e9SAndroid Build Coastguard Workerendif()
814*da0073e9SAndroid Build Coastguard Worker
815*da0073e9SAndroid Build Coastguard Worker# Find the CUDA Runtime Library libcudart
816*da0073e9SAndroid Build Coastguard Workerfind_library(CUDA_CUDART
817*da0073e9SAndroid Build Coastguard Worker  NAMES cudart
818*da0073e9SAndroid Build Coastguard Worker  PATH_SUFFIXES lib64 lib/x64
819*da0073e9SAndroid Build Coastguard Worker)
820*da0073e9SAndroid Build Coastguard Workerfind_library(CUDA_CUDART
821*da0073e9SAndroid Build Coastguard Worker  NAMES cudart
822*da0073e9SAndroid Build Coastguard Worker  PATH_SUFFIXES lib64/stubs lib/x64/stubs
823*da0073e9SAndroid Build Coastguard Worker)
824*da0073e9SAndroid Build Coastguard Worker
825*da0073e9SAndroid Build Coastguard Workerif(NOT CUDA_CUDART AND NOT CUDAToolkit_FIND_QUIETLY)
826*da0073e9SAndroid Build Coastguard Worker  message(STATUS "Unable to find cudart library.")
827*da0073e9SAndroid Build Coastguard Workerendif()
828*da0073e9SAndroid Build Coastguard Worker
829*da0073e9SAndroid Build Coastguard Workerif(_CUDAToolkit_Pop_Prefix)
830*da0073e9SAndroid Build Coastguard Worker  list(REMOVE_AT CMAKE_PREFIX_PATH -1)
831*da0073e9SAndroid Build Coastguard Worker  unset(_CUDAToolkit_Pop_Prefix)
832*da0073e9SAndroid Build Coastguard Workerendif()
833*da0073e9SAndroid Build Coastguard Worker
834*da0073e9SAndroid Build Coastguard Worker#-----------------------------------------------------------------------------
835*da0073e9SAndroid Build Coastguard Worker# Perform version comparison and validate all required variables are set.
836*da0073e9SAndroid Build Coastguard Workerinclude(FindPackageHandleStandardArgs)
837*da0073e9SAndroid Build Coastguard Workerfind_package_handle_standard_args(CUDAToolkit
838*da0073e9SAndroid Build Coastguard Worker  REQUIRED_VARS
839*da0073e9SAndroid Build Coastguard Worker    CUDAToolkit_INCLUDE_DIR
840*da0073e9SAndroid Build Coastguard Worker    CUDAToolkit_VERSION
841*da0073e9SAndroid Build Coastguard Worker    CUDA_CUDART
842*da0073e9SAndroid Build Coastguard Worker    CUDAToolkit_BIN_DIR
843*da0073e9SAndroid Build Coastguard Worker  VERSION_VAR
844*da0073e9SAndroid Build Coastguard Worker    CUDAToolkit_VERSION
845*da0073e9SAndroid Build Coastguard Worker)
846*da0073e9SAndroid Build Coastguard Worker
847*da0073e9SAndroid Build Coastguard Workermark_as_advanced(CUDA_CUDART
848*da0073e9SAndroid Build Coastguard Worker                 CUDAToolkit_INCLUDE_DIR
849*da0073e9SAndroid Build Coastguard Worker                 CUDAToolkit_NVCC_EXECUTABLE
850*da0073e9SAndroid Build Coastguard Worker                 CUDAToolkit_SENTINEL_FILE
851*da0073e9SAndroid Build Coastguard Worker                 )
852*da0073e9SAndroid Build Coastguard Worker
853*da0073e9SAndroid Build Coastguard Worker#-----------------------------------------------------------------------------
854*da0073e9SAndroid Build Coastguard Worker# Construct result variables
855*da0073e9SAndroid Build Coastguard Workerif(CUDAToolkit_FOUND)
856*da0073e9SAndroid Build Coastguard Worker  set(CUDAToolkit_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIR})
857*da0073e9SAndroid Build Coastguard Worker  get_filename_component(CUDAToolkit_LIBRARY_DIR ${CUDA_CUDART} DIRECTORY ABSOLUTE)
858*da0073e9SAndroid Build Coastguard Workerendif()
859*da0073e9SAndroid Build Coastguard Worker
860*da0073e9SAndroid Build Coastguard Worker#-----------------------------------------------------------------------------
861*da0073e9SAndroid Build Coastguard Worker# Construct import targets
862*da0073e9SAndroid Build Coastguard Workerif(CUDAToolkit_FOUND)
863*da0073e9SAndroid Build Coastguard Worker
864*da0073e9SAndroid Build Coastguard Worker  function(_CUDAToolkit_find_and_add_import_lib lib_name)
865*da0073e9SAndroid Build Coastguard Worker    cmake_parse_arguments(arg "" "" "ALT;DEPS;EXTRA_HINTS;EXTRA_PATH_SUFFIXES;EXTRA_INCLUDE_DIRS" ${ARGN})
866*da0073e9SAndroid Build Coastguard Worker
867*da0073e9SAndroid Build Coastguard Worker    set(search_names ${lib_name} ${arg_ALT})
868*da0073e9SAndroid Build Coastguard Worker
869*da0073e9SAndroid Build Coastguard Worker    find_library(CUDA_${lib_name}_LIBRARY
870*da0073e9SAndroid Build Coastguard Worker      NAMES ${search_names}
871*da0073e9SAndroid Build Coastguard Worker      HINTS ${CUDAToolkit_LIBRARY_DIR}
872*da0073e9SAndroid Build Coastguard Worker            ENV CUDA_PATH
873*da0073e9SAndroid Build Coastguard Worker            ${arg_EXTRA_HINTS}
874*da0073e9SAndroid Build Coastguard Worker      PATH_SUFFIXES nvidia/current lib64 lib/x64 lib
875*da0073e9SAndroid Build Coastguard Worker                    ${arg_EXTRA_PATH_SUFFIXES}
876*da0073e9SAndroid Build Coastguard Worker    )
877*da0073e9SAndroid Build Coastguard Worker    # Don't try any stub directories until we have exhausted all other
878*da0073e9SAndroid Build Coastguard Worker    # search locations.
879*da0073e9SAndroid Build Coastguard Worker    find_library(CUDA_${lib_name}_LIBRARY
880*da0073e9SAndroid Build Coastguard Worker      NAMES ${search_names}
881*da0073e9SAndroid Build Coastguard Worker      HINTS ${CUDAToolkit_LIBRARY_DIR}
882*da0073e9SAndroid Build Coastguard Worker            ENV CUDA_PATH
883*da0073e9SAndroid Build Coastguard Worker            ${arg_EXTRA_HINTS}
884*da0073e9SAndroid Build Coastguard Worker      PATH_SUFFIXES lib64/stubs lib/x64/stubs lib/stubs stubs
885*da0073e9SAndroid Build Coastguard Worker                    # Support NVHPC splayed math library layout
886*da0073e9SAndroid Build Coastguard Worker                    ../../math_libs/${CUDAToolkit_VERSION_MAJOR}.${CUDAToolkit_VERSION_MINOR}/lib64
887*da0073e9SAndroid Build Coastguard Worker                    ../../math_libs/lib64
888*da0073e9SAndroid Build Coastguard Worker    )
889*da0073e9SAndroid Build Coastguard Worker
890*da0073e9SAndroid Build Coastguard Worker    mark_as_advanced(CUDA_${lib_name}_LIBRARY)
891*da0073e9SAndroid Build Coastguard Worker
892*da0073e9SAndroid Build Coastguard Worker    if(NOT TARGET CUDA::${lib_name} AND CUDA_${lib_name}_LIBRARY)
893*da0073e9SAndroid Build Coastguard Worker      add_library(CUDA::${lib_name} UNKNOWN IMPORTED)
894*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
895*da0073e9SAndroid Build Coastguard Worker          INTERFACE_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIRS}")
896*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
897*da0073e9SAndroid Build Coastguard Worker          INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIRS}")
898*da0073e9SAndroid Build Coastguard Worker      if(DEFINED CUDAToolkit_MATH_INCLUDE_DIR)
899*da0073e9SAndroid Build Coastguard Worker        string(FIND ${CUDA_${lib_name}_LIBRARY} "math_libs" math_libs)
900*da0073e9SAndroid Build Coastguard Worker        if(NOT ${math_libs} EQUAL -1)
901*da0073e9SAndroid Build Coastguard Worker          set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
902*da0073e9SAndroid Build Coastguard Worker              INTERFACE_INCLUDE_DIRECTORIES "${CUDAToolkit_MATH_INCLUDE_DIRS}")
903*da0073e9SAndroid Build Coastguard Worker          set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
904*da0073e9SAndroid Build Coastguard Worker              INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${CUDAToolkit_MATH_INCLUDE_DIRS}")
905*da0073e9SAndroid Build Coastguard Worker        endif()
906*da0073e9SAndroid Build Coastguard Worker      endif()
907*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET CUDA::${lib_name} PROPERTY IMPORTED_LOCATION "${CUDA_${lib_name}_LIBRARY}")
908*da0073e9SAndroid Build Coastguard Worker      foreach(dep ${arg_DEPS})
909*da0073e9SAndroid Build Coastguard Worker        if(TARGET CUDA::${dep})
910*da0073e9SAndroid Build Coastguard Worker          set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
911*da0073e9SAndroid Build Coastguard Worker              INTERFACE_LINK_LIBRARIES CUDA::${dep})
912*da0073e9SAndroid Build Coastguard Worker        endif()
913*da0073e9SAndroid Build Coastguard Worker      endforeach()
914*da0073e9SAndroid Build Coastguard Worker      if(arg_EXTRA_INCLUDE_DIRS)
915*da0073e9SAndroid Build Coastguard Worker        set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
916*da0073e9SAndroid Build Coastguard Worker            INTERFACE_INCLUDE_DIRECTORIES "${arg_EXTRA_INCLUDE_DIRS}")
917*da0073e9SAndroid Build Coastguard Worker        set_property(TARGET CUDA::${lib_name} APPEND PROPERTY
918*da0073e9SAndroid Build Coastguard Worker            INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${arg_EXTRA_INCLUDE_DIRS}")
919*da0073e9SAndroid Build Coastguard Worker      endif()
920*da0073e9SAndroid Build Coastguard Worker    endif()
921*da0073e9SAndroid Build Coastguard Worker  endfunction()
922*da0073e9SAndroid Build Coastguard Worker
923*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET CUDA::toolkit)
924*da0073e9SAndroid Build Coastguard Worker    add_library(CUDA::toolkit IMPORTED INTERFACE)
925*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET CUDA::toolkit APPEND PROPERTY
926*da0073e9SAndroid Build Coastguard Worker        INTERFACE_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIRS}")
927*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET CUDA::toolkit APPEND PROPERTY
928*da0073e9SAndroid Build Coastguard Worker        INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${CUDAToolkit_INCLUDE_DIRS}")
929*da0073e9SAndroid Build Coastguard Worker  endif()
930*da0073e9SAndroid Build Coastguard Worker
931*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cuda_driver ALT cuda)
932*da0073e9SAndroid Build Coastguard Worker
933*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cudart)
934*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cudart_static)
935*da0073e9SAndroid Build Coastguard Worker
936*da0073e9SAndroid Build Coastguard Worker  # setup dependencies that are required for cudart_static when building
937*da0073e9SAndroid Build Coastguard Worker  # on linux. These are generally only required when using the CUDA toolkit
938*da0073e9SAndroid Build Coastguard Worker  # when CUDA language is disabled
939*da0073e9SAndroid Build Coastguard Worker  if(NOT TARGET CUDA::cudart_static_deps
940*da0073e9SAndroid Build Coastguard Worker     AND TARGET CUDA::cudart_static)
941*da0073e9SAndroid Build Coastguard Worker
942*da0073e9SAndroid Build Coastguard Worker    add_library(CUDA::cudart_static_deps IMPORTED INTERFACE)
943*da0073e9SAndroid Build Coastguard Worker    set_property(TARGET CUDA::cudart_static APPEND PROPERTY
944*da0073e9SAndroid Build Coastguard Worker        INTERFACE_LINK_LIBRARIES CUDA::cudart_static_deps)
945*da0073e9SAndroid Build Coastguard Worker
946*da0073e9SAndroid Build Coastguard Worker    if(UNIX AND (CMAKE_C_COMPILER OR CMAKE_CXX_COMPILER))
947*da0073e9SAndroid Build Coastguard Worker      find_package(Threads REQUIRED)
948*da0073e9SAndroid Build Coastguard Worker      set_property(TARGET CUDA::cudart_static_deps APPEND PROPERTY
949*da0073e9SAndroid Build Coastguard Worker          INTERFACE_LINK_LIBRARIES Threads::Threads ${CMAKE_DL_LIBS})
950*da0073e9SAndroid Build Coastguard Worker    endif()
951*da0073e9SAndroid Build Coastguard Worker
952*da0073e9SAndroid Build Coastguard Worker    if(UNIX AND NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "QNX"))
953*da0073e9SAndroid Build Coastguard Worker      # On Linux, you must link against librt when using the static cuda runtime.
954*da0073e9SAndroid Build Coastguard Worker      find_library(CUDAToolkit_rt_LIBRARY rt)
955*da0073e9SAndroid Build Coastguard Worker      mark_as_advanced(CUDAToolkit_rt_LIBRARY)
956*da0073e9SAndroid Build Coastguard Worker      if(NOT CUDAToolkit_rt_LIBRARY)
957*da0073e9SAndroid Build Coastguard Worker        message(WARNING "Could not find librt library, needed by CUDA::cudart_static")
958*da0073e9SAndroid Build Coastguard Worker      else()
959*da0073e9SAndroid Build Coastguard Worker        set_property(TARGET CUDA::cudart_static_deps APPEND PROPERTY
960*da0073e9SAndroid Build Coastguard Worker            INTERFACE_LINK_LIBRARIES ${CUDAToolkit_rt_LIBRARY})
961*da0073e9SAndroid Build Coastguard Worker      endif()
962*da0073e9SAndroid Build Coastguard Worker    endif()
963*da0073e9SAndroid Build Coastguard Worker  endif()
964*da0073e9SAndroid Build Coastguard Worker
965*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(culibos) # it's a static library
966*da0073e9SAndroid Build Coastguard Worker  foreach(cuda_lib cublasLt cufft curand cusparse nppc nvjpeg)
967*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(${cuda_lib})
968*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(${cuda_lib}_static DEPS culibos)
969*da0073e9SAndroid Build Coastguard Worker  endforeach()
970*da0073e9SAndroid Build Coastguard Worker
971*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 11.0.0)
972*da0073e9SAndroid Build Coastguard Worker    # cublas depends on cublasLt
973*da0073e9SAndroid Build Coastguard Worker    # https://docs.nvidia.com/cuda/archive/11.0/cublas/index.html#static-library
974*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cublas DEPS cublasLt)
975*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cublas_static DEPS cublasLt_static)
976*da0073e9SAndroid Build Coastguard Worker  else()
977*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cublas)
978*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cublas_static DEPS culibos)
979*da0073e9SAndroid Build Coastguard Worker  endif()
980*da0073e9SAndroid Build Coastguard Worker
981*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 11.4)
982*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cuFile ALT cufile DEPS culibos)
983*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cuFile_static ALT cufile_static DEPS culibos)
984*da0073e9SAndroid Build Coastguard Worker
985*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cuFile_rdma ALT cufile_rdma DEPS cuFile culibos)
986*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cuFile_rdma_static ALT cufile_rdma_static DEPS cuFile_static culibos)
987*da0073e9SAndroid Build Coastguard Worker  endif()
988*da0073e9SAndroid Build Coastguard Worker
989*da0073e9SAndroid Build Coastguard Worker  # cuFFTW depends on cuFFT
990*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cufftw DEPS cufft)
991*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cufftw_static DEPS cufft_static)
992*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 9.2)
993*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cufft_static_nocallback DEPS culibos)
994*da0073e9SAndroid Build Coastguard Worker  endif()
995*da0073e9SAndroid Build Coastguard Worker
996*da0073e9SAndroid Build Coastguard Worker  # cuSOLVER depends on cuBLAS, and cuSPARSE
997*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cusolver DEPS cublas cusparse)
998*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(cusolver_static DEPS cublas_static cusparse_static culibos)
999*da0073e9SAndroid Build Coastguard Worker
1000*da0073e9SAndroid Build Coastguard Worker
1001*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION VERSION_GREATER_EQUAL 10.1.2)
1002*da0073e9SAndroid Build Coastguard Worker    # cusolver depends on liblapack_static.a starting with CUDA 10.1 update 2,
1003*da0073e9SAndroid Build Coastguard Worker    # https://docs.nvidia.com/cuda/archive/11.5.0/cusolver/index.html#static-link-lapack
1004*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cusolver_lapack_static ALT lapack_static) # implementation detail static lib
1005*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cusolver_static DEPS cusolver_lapack_static)
1006*da0073e9SAndroid Build Coastguard Worker  endif()
1007*da0073e9SAndroid Build Coastguard Worker
1008*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_VERSION VERSION_GREATER 11.2.1)
1009*da0073e9SAndroid Build Coastguard Worker    # cusolver depends on libcusolver_metis and cublasLt
1010*da0073e9SAndroid Build Coastguard Worker    # https://docs.nvidia.com/cuda/archive/11.2.2/cusolver/index.html#link-dependency
1011*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cusolver DEPS cublasLt)
1012*da0073e9SAndroid Build Coastguard Worker
1013*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cusolver_metis_static ALT metis_static) # implementation detail static lib
1014*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cusolver_static DEPS cusolver_metis_static cublasLt_static)
1015*da0073e9SAndroid Build Coastguard Worker  endif()
1016*da0073e9SAndroid Build Coastguard Worker
1017*da0073e9SAndroid Build Coastguard Worker  # nvGRAPH depends on cuRAND, and cuSOLVER.
1018*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(nvgraph DEPS curand cusolver)
1019*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(nvgraph_static DEPS curand_static cusolver_static)
1020*da0073e9SAndroid Build Coastguard Worker
1021*da0073e9SAndroid Build Coastguard Worker  # Process the majority of the NPP libraries.
1022*da0073e9SAndroid Build Coastguard Worker  foreach(cuda_lib nppial nppicc nppidei nppif nppig nppim nppist nppitc npps nppicom nppisu)
1023*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(${cuda_lib} DEPS nppc)
1024*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(${cuda_lib}_static DEPS nppc_static)
1025*da0073e9SAndroid Build Coastguard Worker  endforeach()
1026*da0073e9SAndroid Build Coastguard Worker
1027*da0073e9SAndroid Build Coastguard Worker  find_path(CUDAToolkit_CUPTI_INCLUDE_DIR cupti.h PATHS
1028*da0073e9SAndroid Build Coastguard Worker      "${CUDAToolkit_ROOT_DIR}/extras/CUPTI/include"
1029*da0073e9SAndroid Build Coastguard Worker      "${CUDAToolkit_INCLUDE_DIR}/../extras/CUPTI/include"
1030*da0073e9SAndroid Build Coastguard Worker      "${CUDAToolkit_INCLUDE_DIR}"
1031*da0073e9SAndroid Build Coastguard Worker      NO_DEFAULT_PATH)
1032*da0073e9SAndroid Build Coastguard Worker  mark_as_advanced(CUDAToolkit_CUPTI_INCLUDE_DIR)
1033*da0073e9SAndroid Build Coastguard Worker
1034*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_CUPTI_INCLUDE_DIR)
1035*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cupti
1036*da0073e9SAndroid Build Coastguard Worker                                        EXTRA_PATH_SUFFIXES ../extras/CUPTI/lib64/
1037*da0073e9SAndroid Build Coastguard Worker                                                            ../extras/CUPTI/lib/
1038*da0073e9SAndroid Build Coastguard Worker                                        EXTRA_INCLUDE_DIRS "${CUDAToolkit_CUPTI_INCLUDE_DIR}")
1039*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(cupti_static
1040*da0073e9SAndroid Build Coastguard Worker                                        EXTRA_PATH_SUFFIXES ../extras/CUPTI/lib64/
1041*da0073e9SAndroid Build Coastguard Worker                                                            ../extras/CUPTI/lib/
1042*da0073e9SAndroid Build Coastguard Worker                                        EXTRA_INCLUDE_DIRS "${CUDAToolkit_CUPTI_INCLUDE_DIR}")
1043*da0073e9SAndroid Build Coastguard Worker  endif()
1044*da0073e9SAndroid Build Coastguard Worker
1045*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(nvrtc DEPS cuda_driver)
1046*da0073e9SAndroid Build Coastguard Worker
1047*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(nvml ALT nvidia-ml nvml)
1048*da0073e9SAndroid Build Coastguard Worker
1049*da0073e9SAndroid Build Coastguard Worker  # nvtools can be installed outside the CUDA toolkit directory,
1050*da0073e9SAndroid Build Coastguard Worker  # so search the NVTOOLSEXT_PATH windows only environment variable
1051*da0073e9SAndroid Build Coastguard Worker  set(nvToolsExt_EXTRA_PATH)
1052*da0073e9SAndroid Build Coastguard Worker  if(WIN32)
1053*da0073e9SAndroid Build Coastguard Worker     set(nvToolsExt_EXTRA_PATH "C:\\Program Files\\NVIDIA Corporation\\NvToolsExt")
1054*da0073e9SAndroid Build Coastguard Worker  endif()
1055*da0073e9SAndroid Build Coastguard Worker
1056*da0073e9SAndroid Build Coastguard Worker  find_path(CUDAToolkit_nvToolsExt_INCLUDE_DIR nvToolsExt.h
1057*da0073e9SAndroid Build Coastguard Worker      PATHS "${CUDAToolkit_INCLUDE_DIR}"
1058*da0073e9SAndroid Build Coastguard Worker            "${CUDAToolkit_ROOT_DIR}"
1059*da0073e9SAndroid Build Coastguard Worker            ENV NVTOOLSEXT_PATH
1060*da0073e9SAndroid Build Coastguard Worker            "${nvToolsExt_EXTRA_PATH}"
1061*da0073e9SAndroid Build Coastguard Worker      PATH_SUFFIXES include
1062*da0073e9SAndroid Build Coastguard Worker      NO_DEFAULT_PATH)
1063*da0073e9SAndroid Build Coastguard Worker  mark_as_advanced(CUDAToolkit_nvToolsExt_INCLUDE_DIR)
1064*da0073e9SAndroid Build Coastguard Worker
1065*da0073e9SAndroid Build Coastguard Worker  if(CUDAToolkit_nvToolsExt_INCLUDE_DIR)
1066*da0073e9SAndroid Build Coastguard Worker    _CUDAToolkit_find_and_add_import_lib(nvToolsExt
1067*da0073e9SAndroid Build Coastguard Worker        ALT nvToolsExt64 nvToolsExt64_1
1068*da0073e9SAndroid Build Coastguard Worker        EXTRA_HINTS ENV NVTOOLSEXT_PATH
1069*da0073e9SAndroid Build Coastguard Worker                    "${nvToolsExt_EXTRA_PATH}"
1070*da0073e9SAndroid Build Coastguard Worker        EXTRA_INCLUDE_DIRS "${CUDAToolkit_nvToolsExt_INCLUDE_DIR}")
1071*da0073e9SAndroid Build Coastguard Worker  endif()
1072*da0073e9SAndroid Build Coastguard Worker
1073*da0073e9SAndroid Build Coastguard Worker  _CUDAToolkit_find_and_add_import_lib(OpenCL)
1074*da0073e9SAndroid Build Coastguard Workerendif()
1075*da0073e9SAndroid Build Coastguard Worker
1076*da0073e9SAndroid Build Coastguard Workerunset(CUDAToolkit_ROOT_DIR)
1077*da0073e9SAndroid Build Coastguard Worker
1078*da0073e9SAndroid Build Coastguard Workerif(_CUDAToolkit_Pop_ROOT_PATH)
1079*da0073e9SAndroid Build Coastguard Worker  list(REMOVE_AT CMAKE_FIND_ROOT_PATH 0)
1080*da0073e9SAndroid Build Coastguard Worker  unset(_CUDAToolkit_Pop_ROOT_PATH)
1081*da0073e9SAndroid Build Coastguard Workerendif()
1082