cuda.bindings._v2.driver.launch_cooperative_kernel_multi_device#
- cuda.bindings._v2.driver.launch_cooperative_kernel_multi_device(
- launch_params_list,
- unsigned int num_devices,
- unsigned int flags,
Launches CUDA functions on multiple devices where thread blocks can cooperate and synchronize as they execute.
[Deprecated]. Invokes kernels as specified in the
launch_params_listarray where each element of the array specifies all the parameters required to perform a single kernel launch. These kernels can cooperate and synchronize as they execute. The size of the array is specified bynum_devices. No two kernels can be launched on the same device. All the devices targeted by this multi-device launch must be identical. All devices must have a non-zero value for the device attributeCU_DEVICE_ATTRIBUTE_COOPERATIVE_MULTI_DEVICE_LAUNCH. All kernels launched must be identical with respect to the compiled code. Note that any device, constant or managed variables present in the module that owns the kernel launched on each device, are independently instantiated on every device. It is the application’s responsibility to ensure these variables are initialized and used appropriately. The size of the grids as specified in blocks, the size of the blocks themselves and the amount of shared memory used by each thread block must also match across all launched kernels. The streams used to launch these kernels must have been created via eithercuStreamCreateorcuStreamCreateWithPriority. The NULL stream orCU_STREAM_LEGACYorCU_STREAM_PER_THREADcannot be used. The total number of blocks launched per kernel cannot exceed the maximum number of blocks per multiprocessor as returned bycuOccupancyMaxActiveBlocksPerMultiprocessor(orcuOccupancyMaxActiveBlocksPerMultiprocessorWithFlags) times the number of multiprocessors as specified by the device attributeCU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT. Since the total number of blocks launched per device has to match across all devices, the maximum number of blocks that can be launched per device will be limited by the device with the least number of multiprocessors. The kernels cannot make use of CUDA dynamic parallelism. TheCUDA_LAUNCH_PARAMSstructure is defined as:. **View CUDA Toolkit Documentation for a C++ code example**. where:.CUDA_LAUNCH_PARAMS.functionspecifies the kernel to be launched. All functions must be identical with respect to the compiled code. Note that you can also specify context-less kernelCUkernelby querying the handle usinglibrary_get_kernel()and then casting toCUfunction. In this case, the context to launch the kernel on be taken from the specified streamCUDA_LAUNCH_PARAMS.hStream.CUDA_LAUNCH_PARAMS.gridDimXis the width of the grid in blocks. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.gridDimYis the height of the grid in blocks. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.gridDimZis the depth of the grid in blocks. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.blockDimXis the X dimension of each thread block. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.blockDimXis the Y dimension of each thread block. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.blockDimZis the Z dimension of each thread block. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.sharedMemBytesis the dynamic shared-memory size per thread block in bytes. This must match across all kernels launched.CUDA_LAUNCH_PARAMS.hStreamis the handle to the stream to perform the launch in. This cannot be the NULL stream orCU_STREAM_LEGACYorCU_STREAM_PER_THREAD. The CUDA context associated with this stream must match that associated withCUDA_LAUNCH_PARAMS.function.CUDA_LAUNCH_PARAMS.kernelParamsis an array of pointers to kernel parameters. IfCUDA_LAUNCH_PARAMS.functionhas N parameters, thenCUDA_LAUNCH_PARAMS.kernelParamsneeds to be an array of N pointers. Each ofCUDA_LAUNCH_PARAMS.kernelParams[0] throughCUDA_LAUNCH_PARAMS.kernelParams[N-1] must point to a region of memory from which the actual kernel parameter will be copied. The number of kernel parameters and their offsets and sizes do not need to be specified as that information is retrieved directly from the kernel’s image.
By default, the kernel won’t begin execution on any GPU until all prior work in all the specified streams has completed. This behavior can be overridden by specifying the flag
CUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_PRE_LAUNCH_SYNC. When this flag is specified, each kernel will only wait for prior work in the stream corresponding to that GPU to complete before it begins execution. Similarly, by default, any subsequent work pushed in any of the specified streams will not begin execution until the kernels on all GPUs have completed. This behavior can be overridden by specifying the flagCUDA_COOPERATIVE_LAUNCH_MULTI_DEVICE_NO_POST_LAUNCH_SYNC. When this flag is specified, any subsequent work pushed in any of the specified streams will only wait for the kernel launched on the GPU corresponding to that stream to complete before it begins execution. Callinglaunch_cooperative_kernel_multi_device()sets persistent function state that is the same as function state set throughcuLaunchKernelAPI when called individually for each element inlaunch_params_list. When kernels are launched vialaunch_cooperative_kernel_multi_device(), the previous block shape, shared size and parameter info associated with eachCUDA_LAUNCH_PARAMS.functioninlaunch_params_listis overwritten. Note that to uselaunch_cooperative_kernel_multi_device(), the kernels must either have been compiled with toolchain version 3.2 or later so that it will contain kernel parameter information, or have no kernel parameters. If either of these conditions is not met, thenlaunch_cooperative_kernel_multi_device()will returnCUDA_ERROR_INVALID_IMAGE.- Parameters:
launch_params_list (intptr_t) – List of launch parameters, one per device.
num_devices (unsigned int) – Size of the
launch_params_listarray.flags (unsigned int) – Flags to control launch behavior.
See also
cuLaunchCooperativeKernelMultiDevice