6.33. C++ API 例程

本节介绍 CUDA 运行时应用程序编程接口的 C++ 高级 API 函数。要使用这些函数,您的应用程序需要使用nvcc编译器进行编译。

class 

函数

template < class T >__host__cudaChannelFormatDesc cudaCreateChannelDesc ( void )
[C++ API] 返回使用指定格式的通道描述符
__host__cudaError_t cudaEventCreate ( cudaEvent_t* event, unsigned int  flags )
[C++ API] 使用指定的标志创建事件对象
template < class T >__host__cudaError_t cudaFuncGetAttributes ( cudaFuncAttributes* attr, T* entry )
[C++ API] 查找给定函数的属性
template < class T >__host__cudaError_t cudaFuncGetName ( const char** name, T* func )
返回设备入口函数指针的函数名称。
template < class T >__host__cudaError_t cudaFuncSetAttribute ( T* func, cudaFuncAttribute attr, int  value )
[C++ API] 设置给定函数的属性
template < class T >__host__cudaError_t cudaFuncSetCacheConfig ( T* func, cudaFuncCache cacheConfig )
[C++ API] 设置设备函数的首选缓存配置
template < class T >__host__cudaError_t cudaGetKernel ( cudaKernel_t* kernelPtr, T* func )
获取与入口函数 entryFuncAddr 匹配的设备内核指针。
template < class T >__host__cudaError_t cudaGetSymbolAddress ( void** devPtr, const T& symbol )
[C++ API] 查找与 CUDA 符号关联的地址
template < class T >__host__cudaError_t cudaGetSymbolSize ( size_t* size, const T& symbol )
[C++ API] 查找与 CUDA 符号关联的对象的大小
template < class T >__host__cudaError_t cudaGraphAddMemcpyNodeFromSymbol ( cudaGraphNode_t* pGraphNode, cudaGraph_t graph, const cudaGraphNode_t* pDependencies, size_t numDependencies, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind )
创建从设备上的符号复制的 memcpy 节点,并将其添加到图中。
template < class T >__host__cudaError_t cudaGraphAddMemcpyNodeToSymbol ( cudaGraphNode_t* pGraphNode, cudaGraph_t graph, const cudaGraphNode_t* pDependencies, size_t numDependencies, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind )
创建复制到设备上符号的 memcpy 节点,并将其添加到图中。
template < class T >__host__cudaError_t cudaGraphExecMemcpyNodeSetParamsFromSymbol ( cudaGraphExec_t hGraphExec, cudaGraphNode_t node, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind )
设置给定 graphExec 中 memcpy 节点的参数,以从设备上的符号复制。
template < class T >__host__cudaError_t cudaGraphExecMemcpyNodeSetParamsToSymbol ( cudaGraphExec_t hGraphExec, cudaGraphNode_t node, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind )
设置给定 graphExec 中 memcpy 节点的参数,以复制到设备上的符号。
__host__cudaError_t cudaGraphInstantiate ( cudaGraphExec_t* pGraphExec, cudaGraph_t graph, cudaGraphNode_t* pErrorNode, char* pLogBuffer, size_t bufferSize )
从图创建可执行图。
template < class T >__host__cudaError_t cudaGraphMemcpyNodeSetParamsFromSymbol ( cudaGraphNode_t node, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind )
设置 memcpy 节点的参数,以从设备上的符号复制。
template < class T >__host__cudaError_t cudaGraphMemcpyNodeSetParamsToSymbol ( cudaGraphNode_t node, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind )
设置 memcpy 节点的参数,以复制到设备上的符号。
template < class T >__host__cudaError_t cudaLaunchCooperativeKernel ( T* func, dim3 gridDim, dim3 blockDim, void** args, size_t sharedMem = 0, cudaStream_t stream = 0 )
启动设备函数。
template < class T >__host__cudaError_t cudaLaunchKernel ( T* func, dim3 gridDim, dim3 blockDim, void** args, size_t sharedMem = 0, cudaStream_t stream = 0 )
启动设备函数。
template < typename... ActTypes >__host__cudaError_t cudaLaunchKernelEx ( const cudaLaunchConfig_t* config, const cudaKernel_t kernel, ActTypes &&... args )
使用启动时配置启动 CUDA 函数。
template < typename... ExpTypes, typename... ActTypes >__host__cudaError_t cudaLaunchKernelEx ( const cudaLaunchConfig_t* config, void(*)(ExpTypes...) kernel, ActTypes &&... args )
使用启动时配置启动 CUDA 函数。
template < class T >__host__cudaError_t cudaLibraryGetGlobal ( T** dptr, size_t* bytes, cudaLibrary_t library, const char* name )
返回全局设备指针。
template < class T >__host__cudaError_t cudaLibraryGetManaged ( T** dptr, size_t* bytes, cudaLibrary_t library, const char* name )
返回指向托管内存的指针。
template < class T >__host__cudaError_t cudaLibraryGetUnifiedFunction ( T** fptr, cudaLibrary_t library, const char* symbol )
返回指向统一函数的指针。
__host__cudaError_t cudaMallocAsync ( void** ptr, size_t size, cudaMemPool_t memPool, cudaStream_t stream )
从池中分配。
__host__cudaError_t cudaMallocHost ( void** ptr, size_t size, unsigned int  flags )
[C++ API] 在主机上分配页锁定内存
template < class T >__host__cudaError_t cudaMallocManaged ( T** devPtr, size_t size, unsigned int  flags = cudaMemAttachGlobal )
分配将由统一内存系统自动管理的内存。
template < class T >cudaError_t cudaMemAdvise ( T* devPtr, size_t count, cudaMemoryAdvise advice, cudaMemLocation location )
就给定内存范围的用法提供建议。
template < typename T, typename U >__host__cudaError_t cudaMemcpyBatchAsync ( T** dsts, U** srcs, size_t* sizes, size_t count, cudaMemcpyAttributes attr, size_t* failIdx, cudaStream_t hStream )
异步执行一批内存复制。
template < typename T, typename U >__host__cudaError_t cudaMemcpyBatchAsync ( T** dsts, U** srcs, size_t* sizes, size_t count, cudaMemcpyAttributes* attrs, size_t* attrsIdxs, size_t numAttrs, size_t* failIdx, cudaStream_t hStream )
异步执行一批内存复制。
template < class T >__host__cudaError_t cudaMemcpyFromSymbol ( void* dst, const T& symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost )
[C++ API] 从设备上的给定符号复制数据
template < class T >__host__cudaError_t cudaMemcpyFromSymbolAsync ( void* dst, const T& symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost, cudaStream_t stream = 0 )
[C++ API] 从设备上的给定符号复制数据
template < class T >__host__cudaError_t cudaMemcpyToSymbol ( const T& symbol, const void* src, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyHostToDevice )
[C++ API] 将数据复制到设备上的给定符号
template < class T >__host__cudaError_t cudaMemcpyToSymbolAsync ( const T& symbol, const void* src, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyHostToDevice, cudaStream_t stream = 0 )
[C++ API] 将数据复制到设备上的给定符号
template < class T >__host__cudaError_t cudaOccupancyAvailableDynamicSMemPerBlock ( size_t* dynamicSmemSize, T* func, int  numBlocks, int  blockSize )
返回在 SM 上启动 numBlocks 个块时,每个块可用的动态共享内存。
template < class T >__host__cudaError_t cudaOccupancyMaxActiveBlocksPerMultiprocessor ( int* numBlocks, T func, int  blockSize, size_t dynamicSMemSize )
返回设备函数的占用率。
template < class T >__host__cudaError_t cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags ( int* numBlocks, T func, int  blockSize, size_t dynamicSMemSize, unsigned int  flags )
返回带有指定标志的设备函数的占用率。
template < class T >__host__cudaError_t cudaOccupancyMaxActiveClusters ( int* numClusters, T* func, const cudaLaunchConfig_t* config )
给定内核函数 (func) 和启动配置 (config),返回目标设备上可以共存的最大集群数量,结果保存在 *numClusters 中。
template < class T >__host__cudaError_t cudaOccupancyMaxPotentialBlockSize ( int* minGridSize, int* blockSize, T func, size_t dynamicSMemSize = 0, int  blockSizeLimit = 0 )
返回网格和块大小,以实现设备函数的最大潜在占用率。
template < typename UnaryFunction, class T >__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeVariableSMem ( int* minGridSize, int* blockSize, T func, UnaryFunction blockSizeToDynamicSMemSize, int  blockSizeLimit = 0 )
返回网格和块大小,以实现设备函数的最大潜在占用率。
template < typename UnaryFunction, class T >__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags ( int* minGridSize, int* blockSize, T func, UnaryFunction blockSizeToDynamicSMemSize, int  blockSizeLimit = 0, unsigned int  flags = 0 )
返回网格和块大小,以实现设备函数的最大潜在占用率。
template < class T >__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeWithFlags ( int* minGridSize, int* blockSize, T func, size_t dynamicSMemSize = 0, int  blockSizeLimit = 0, unsigned int  flags = 0 )
返回网格和块大小,以实现带有指定标志的设备函数的最大潜在占用率。
template < class T >__host__cudaError_t cudaOccupancyMaxPotentialClusterSize ( int* clusterSize, T* func, const cudaLaunchConfig_t* config )
给定内核函数 (func) 和启动配置 (config),返回 *clusterSize 中的最大集群大小。
template < class T >__host__cudaError_t cudaStreamAttachMemAsync ( cudaStream_t stream, T* devPtr, size_t length = 0, unsigned int  flags = cudaMemAttachSingle )
异步将内存附加到流。

函数

template < class T >

__host__cudaChannelFormatDesc cudaCreateChannelDesc ( void ) [inline]
[C++ API] 返回使用指定格式的通道描述符
Returns

Channel descriptor with formatf

Description

Returns a channel descriptor with formatfand number of bits of each componentx, y, z, andw. The cudaChannelFormatDesc is defined as

‎  struct cudaChannelFormatDesc {
          int x, y, z, w;
          enum cudaChannelFormatKind 
                  f;
        };

where cudaChannelFormatKind is one of cudaChannelFormatKindSigned, cudaChannelFormatKindUnsigned, cudaChannelFormatKindFloat, cudaChannelFormatKindSignedNormalized8X1, cudaChannelFormatKindSignedNormalized8X2, cudaChannelFormatKindSignedNormalized8X4, cudaChannelFormatKindUnsignedNormalized8X1, cudaChannelFormatKindUnsignedNormalized8X2, cudaChannelFormatKindUnsignedNormalized8X4, cudaChannelFormatKindSignedNormalized16X1, cudaChannelFormatKindSignedNormalized16X2, cudaChannelFormatKindSignedNormalized16X4, cudaChannelFormatKindUnsignedNormalized16X1, cudaChannelFormatKindUnsignedNormalized16X2, cudaChannelFormatKindUnsignedNormalized16X4, cudaChannelFormatKindUnsignedNormalized1010102 or cudaChannelFormatKindNV12.

格式由模板特化指定。

模板函数为以下标量类型进行了特化:char、signed char、unsigned char、short、unsigned short、int、unsigned int、long、unsigned long 和 float。模板函数为以下向量类型进行了特化:char{1|2|4}、uchar{1|2|4}、short{1|2|4}、ushort{1|2|4}、int{1|2|4}、uint{1|2|4}、long{1|2|4}、ulong{1|2|4}、float{1|2|4}。模板函数为以下 cudaChannelFormatKind 枚举值进行了特化:cudaChannelFormatKind{Uns|S}ignedNormalized{8|16}X{1|2|4}、cudaChannelFormatKindUnsignedNormalized1010102cudaChannelFormatKindNV12

在没有特化的情况下调用该类型的函数,默认创建 cudaChannelFormatKindNone 类型的通道格式

另请参阅

cudaCreateChannelDesc ( 底层)cudaGetChannelDesc,

__host__cudaError_t cudaEventCreate ( cudaEvent_t* event, unsigned int  flags )
[C++ API] 使用指定的标志创建事件对象
Parameters
event
- 新创建的事件
flags
- 新事件的标志
Description

使用指定的标志创建事件对象。有效标志包括

Note

另请参阅

cudaEventCreate ( C API), cudaEventCreateWithFlags, cudaEventRecord, cudaEventQuery, cudaEventSynchronize, cudaEventDestroy, cudaEventElapsedTime, cudaStreamWaitEvent

template < class T >

__host__cudaError_t cudaFuncGetAttributes ( cudaFuncAttributes* attr, T* entry ) [inline]
[C++ API] 查找给定函数的属性
Parameters
attr
- 返回指向函数属性的指针
entry
- 要获取属性的函数
Description

此函数获取通过以下方式指定的函数的属性entryentry参数必须是指向在设备上执行的函数的指针。由以下方式指定的参数entry必须声明为__global__函数。获取的属性放置在attr中。如果指定的函数不存在,则返回 cudaErrorInvalidDeviceFunction

请注意,某些函数属性(如 maxThreadsPerBlock)可能会因当前使用的设备而异。

Note

cudaLaunchKernel ( C++ API)cudaFuncSetCacheConfig ( C++ API)cudaFuncGetAttributes ( C API)cudaSetDoubleForDevicecudaSetDoubleForHost

template < class T >

__host__cudaError_t cudaFuncGetName ( const char** name, T* func ) [inline]
返回设备入口函数指针的函数名称。
Parameters
name
- 返回的函数名称
func
- 用于检索名称的函数指针
Description

**name中返回与符号关联的函数名称func。函数名称作为空终止字符串返回。如果函数未声明为具有 C 链接,则此 API 可能会返回乱码名称。如果**name为 NULL,则返回 cudaErrorInvalidValue。如果func不是设备入口函数,则返回 cudaErrorInvalidDeviceFunction

Note

cudaFuncGetName ( C API)

template < class T >

__host__cudaError_t cudaFuncSetAttribute ( T* func, cudaFuncAttribute attr, int  value ) [inline]
[C++ API] 为给定函数设置属性
Parameters
func
attr
- 要设置的属性
value
- 要设置的值
Description

此函数设置通过以下方式指定的函数的属性entryentry参数必须是指向在设备上执行的函数的指针。由以下方式指定的参数entry必须声明为__global__函数。由以下定义的枚举attr设置为由以下定义的值value。如果指定的函数不存在,则返回 cudaErrorInvalidDeviceFunction。如果指定的属性无法写入,或者值不正确,则返回 cudaErrorInvalidValue

的有效值包括attr

Note

cudaLaunchKernel ( C++ API)cudaFuncSetCacheConfig ( C++ API)cudaFuncGetAttributes ( C API)cudaSetDoubleForDevicecudaSetDoubleForHost

template < class T >

__host__cudaError_t cudaFuncSetCacheConfig ( T* func, cudaFuncCache cacheConfig ) [inline]
[C++ API] 为设备函数设置首选缓存配置
Parameters
func
- 设备函数指针
cacheConfig
- 请求的缓存配置
Description

在 L1 缓存和共享内存使用相同硬件资源的设备上,此设置通过cacheConfig为通过以下方式指定的函数设置首选缓存配置func。这只是一个首选项。运行时将在可能的情况下使用请求的配置,但如果执行func.

func参数必须是指向在设备上执行的函数的指针。由以下方式指定的参数func必须声明为__global__函数需要,则可以自由选择不同的配置。如果指定的函数不存在,则返回 cudaErrorInvalidDeviceFunction

在 L1 缓存和共享内存大小固定的设备上,此设置不起作用。

使用与最近的首选项设置不同的首选项启动内核可能会插入设备端同步点。

支持的缓存配置包括

Note

cudaLaunchKernel ( C++ API)cudaFuncSetCacheConfig ( C API)cudaFuncGetAttributes ( C++ API)cudaSetDoubleForDevicecudaSetDoubleForHostcudaThreadGetCacheConfigcudaThreadSetCacheConfig

template < class T >

__host__cudaError_t cudaGetKernel ( cudaKernel_t* kernelPtr, T* func ) [inline]
获取与入口函数匹配的设备内核的指针entryFuncAddr.
Parameters
kernelPtr
- 返回设备内核
func
Returns

cudaSuccess

Description

kernelPtr与入口函数对应的设备内核entryFuncAddr.

另请参阅

cudaGetKernel ( C API)

template < class T >

__host__cudaError_t cudaGetSymbolAddress ( void** devPtr, const T& symbol ) [inline]
[C++ API] 查找与 CUDA 符号关联的地址
Parameters
devPtr
- 返回与符号关联的设备指针
symbol
- 设备符号引用
Description

*devPtr设备上符号的地址symbolsymbol可以是驻留在全局或常量内存空间中的变量。如果symbol找不到,或者如果symbol未在全局或常量内存空间中声明,则*devPtr保持不变,并返回错误 cudaErrorInvalidSymbol

Note

另请参阅

cudaGetSymbolAddress ( C API)cudaGetSymbolSize ( C++ API)

template < class T >

__host__cudaError_t cudaGetSymbolSize ( size_t* size, const T& symbol ) [inline]
[C++ API] 查找与 CUDA 符号关联的对象的大小
Parameters
size
- 与符号关联的对象的大小
symbol
- 设备符号引用
Description

*size符号的大小symbol. symbol必须是驻留在全局或常量内存空间中的变量。如果symbol找不到,或者如果symbol未在全局或常量内存空间中声明,则*size保持不变,并返回错误 cudaErrorInvalidSymbol

Note

另请参阅

cudaGetSymbolAddress ( C++ API)cudaGetSymbolSize ( C API)

template < class T >

__host__cudaError_t cudaGraphAddMemcpyNodeFromSymbol ( cudaGraphNode_t* pGraphNode, cudaGraph_t graph, const cudaGraphNode_t* pDependencies, size_t numDependencies, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
创建一个 memcpy 节点以从设备上的符号复制,并将其添加到图中。
Parameters
pGraphNode
- 返回新创建的节点
graph
- 要向其添加节点的图
pDependencies
- 节点的依赖项
numDependencies
- 依赖项的数量
dst
- 目标内存地址
symbol
- 设备符号地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

创建一个新的 memcpy 节点以从symbol复制,并使用通过graph指定的numDependencies依赖项将其添加到pDependencies

可能为 0,在这种情况下,节点将放置在图的根目录中。numDependenciesto be 0, in which case the node will be placed at the root of the graph.pDependencies不能有任何重复条目。新节点的句柄将在pGraphNode.

中返回。当启动图时,节点将从count指向的内存区域复制offset字节,从符号symbol的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。dst. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind是驻留在全局或常量内存空间中的变量。

可以是 cudaMemcpyDeviceToHostcudaMemcpyDeviceToDevicecudaMemcpyDefault。建议传递 cudaMemcpyDefault,在这种情况下,传输类型是从指针值推断出来的。但是,仅在支持统一虚拟寻址的系统上才允许使用 cudaMemcpyDefault

Note

另请参阅

cudaMemcpyFromSymbol, cudaGraphAddMemcpyNode, cudaGraphAddMemcpyNodeToSymbol, cudaGraphMemcpyNodeGetParams, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsFromSymbol, cudaGraphMemcpyNodeSetParamsToSymbol, cudaGraphCreate, cudaGraphDestroyNode, cudaGraphAddChildGraphNode, cudaGraphAddEmptyNode, cudaGraphAddKernelNode, cudaGraphAddHostNode, cudaGraphAddMemsetNode

template < class T >

__host__cudaError_t cudaGraphAddMemcpyNodeToSymbol ( cudaGraphNode_t* pGraphNode, cudaGraph_t graph, const cudaGraphNode_t* pDependencies, size_t numDependencies, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
创建一个 memcpy 节点,用于复制到设备上的符号,并将其添加到图中。
Parameters
pGraphNode
- 返回新创建的节点
graph
- 要向其添加节点的图
pDependencies
- 节点的依赖项
numDependencies
- 依赖项的数量
symbol
- 设备符号地址
src
- 源内存地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

创建一个新的 memcpy 节点以复制到symbol复制,并使用通过graph指定的numDependencies依赖项将其添加到pDependencies

可能为 0,在这种情况下,节点将放置在图的根目录中。numDependenciesto be 0, in which case the node will be placed at the root of the graph.pDependencies不能有任何重复条目。新节点的句柄将在pGraphNode.

中返回。当启动图时,节点将从count指向的内存区域复制src的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。offset字节,从符号symbol. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyHostToDevicecudaMemcpyDeviceToDevicecudaMemcpyDefault 之一。建议传递 cudaMemcpyDefault,在这种情况下,传输类型将从指针值推断。但是,只有在支持统一虚拟寻址的系统上才允许使用 cudaMemcpyDefault

可以是 cudaMemcpyDeviceToHostcudaMemcpyDeviceToDevicecudaMemcpyDefault。建议传递 cudaMemcpyDefault,在这种情况下,传输类型是从指针值推断出来的。但是,仅在支持统一虚拟寻址的系统上才允许使用 cudaMemcpyDefault

Note

另请参阅

cudaMemcpyToSymbol, cudaGraphAddMemcpyNode, cudaGraphAddMemcpyNodeFromSymbol, cudaGraphMemcpyNodeGetParams, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsToSymbol, cudaGraphMemcpyNodeSetParamsFromSymbol, cudaGraphCreate, cudaGraphDestroyNode, cudaGraphAddChildGraphNode, cudaGraphAddEmptyNode, cudaGraphAddKernelNode, cudaGraphAddHostNode, cudaGraphAddMemsetNode

template < class T >

__host__cudaError_t cudaGraphExecMemcpyNodeSetParamsFromSymbol ( cudaGraphExec_t hGraphExec, cudaGraphNode_t node, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
设置给定 graphExec 中 memcpy 节点的参数,以从设备上的符号复制。
Parameters
hGraphExec
- 要在其中设置指定节点的可执行图
node
- 来自用于实例化 graphExec 的图的 Memcpy 节点
dst
- 目标内存地址
symbol
- 设备符号地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

更新由以下项表示的工作nodehGraphExec如同node在实例化时包含给定的参数一样。node必须保留在用于实例化的图中hGraphExec。更改了进出node的边将被忽略。

symboldst必须从与原始源和目标内存相同的上下文中分配。实例化时的内存操作数必须是一维的。不支持零长度操作。

修改仅影响未来的hGraphExec启动。hGraphExec已排队或正在运行的启动不受此调用的影响。node也不会被此调用修改。

如果内存操作数的映射已更改或原始内存操作数是多维的,则返回 cudaErrorInvalidValue

Note

另请参阅

cudaGraphAddMemcpyNode, cudaGraphAddMemcpyNodeFromSymbol, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsFromSymbol, cudaGraphInstantiate, cudaGraphExecMemcpyNodeSetParams, cudaGraphExecMemcpyNodeSetParamsToSymbol, cudaGraphExecKernelNodeSetParams, cudaGraphExecMemsetNodeSetParams, cudaGraphExecHostNodeSetParams

template < class T >

__host__cudaError_t cudaGraphExecMemcpyNodeSetParamsToSymbol ( cudaGraphExec_t hGraphExec, cudaGraphNode_t node, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
设置给定 graphExec 中 memcpy 节点的参数,以复制到设备上的符号。
Parameters
hGraphExec
- 要在其中设置指定节点的可执行图
node
- 来自用于实例化 graphExec 的图的 Memcpy 节点
symbol
- 设备符号地址
src
- 源内存地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

更新由以下项表示的工作nodehGraphExec如同node在实例化时包含给定的参数一样。node必须保留在用于实例化的图中hGraphExec。更改了进出node的边将被忽略。

srcsymbol必须从与原始源和目标内存相同的上下文中分配。实例化时的内存操作数必须是一维的。不支持零长度操作。

修改仅影响未来的hGraphExec启动。hGraphExec已排队或正在运行的启动不受此调用的影响。node也不会被此调用修改。

如果内存操作数的映射已更改或原始内存操作数是多维的,则返回 cudaErrorInvalidValue

Note

另请参阅

cudaGraphAddMemcpyNode, cudaGraphAddMemcpyNodeToSymbol, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsToSymbol, cudaGraphInstantiate, cudaGraphExecMemcpyNodeSetParams, cudaGraphExecMemcpyNodeSetParamsFromSymbol, cudaGraphExecKernelNodeSetParams, cudaGraphExecMemsetNodeSetParams, cudaGraphExecHostNodeSetParams

__host__cudaError_t cudaGraphInstantiate ( cudaGraphExec_t* pGraphExec, cudaGraph_t graph, cudaGraphNode_t* pErrorNode, char* pLogBuffer, size_t bufferSize )
从图中创建可执行图。
Parameters
pGraphExec
- 返回实例化的图
graph
- 要实例化的图
pErrorNode
- 如果发生实例化错误,则可以修改此项以指示导致错误的节点
pLogBuffer
- 用于存储诊断消息的字符缓冲区
bufferSize
- 日志缓冲区的大小(以字节为单位)
Description

实例化graph作为可执行图。该图会针对任何结构约束或先前未验证的节点内约束进行验证。如果实例化成功,则会在pGraphExec.

中返回实例化图的句柄。pErrorNodepLogBuffer如果有任何错误,则可能会在

Note

另请参阅

中返回诊断信息。这是检查实例化错误的主要方法。除非诊断信息溢出缓冲区,否则输出将以 null 结尾。在这种情况下,它们将被截断,并且可以检查最后一个字节以确定是否发生了截断。

template < class T >

cudaGraphInstantiateWithFlags, cudaGraphCreate, cudaGraphUpload, cudaGraphLaunch, cudaGraphExecDestroy
__host__cudaError_t cudaGraphMemcpyNodeSetParamsFromSymbol ( cudaGraphNode_t node, void* dst, const T& symbol, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
Parameters
node
- 要设置参数的节点
dst
- 目标内存地址
symbol
- 设备符号地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

设置 memcpy 节点的参数node为提供的参数描述的复制。

中返回。当启动图时,节点将从count指向的内存区域复制offset字节,从符号symbol的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。dst. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind是驻留在全局或常量内存空间中的变量。

Note

另请参阅

cudaMemcpyFromSymbol, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsToSymbol, cudaGraphAddMemcpyNode, cudaGraphMemcpyNodeGetParams

template < class T >

__host__cudaError_t cudaGraphMemcpyNodeSetParamsToSymbol ( cudaGraphNode_t node, const T& symbol, const void* src, size_t count, size_t offset, cudaMemcpyKind kind ) [inline]
设置 memcpy 节点的参数,以复制到设备上的符号。
Parameters
node
- 要设置参数的节点
symbol
- 设备符号地址
src
- 源内存地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

设置 memcpy 节点的参数node为提供的参数描述的复制。

中返回。当启动图时,节点将从count指向的内存区域复制src的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。offset字节,从符号symbol. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyHostToDevicecudaMemcpyDeviceToDevicecudaMemcpyDefault 之一。建议传递 cudaMemcpyDefault,在这种情况下,传输类型将从指针值推断。但是,只有在支持统一虚拟寻址的系统上才允许使用 cudaMemcpyDefault

Note

另请参阅

cudaMemcpyToSymbol, cudaGraphMemcpyNodeSetParams, cudaGraphMemcpyNodeSetParamsFromSymbol, cudaGraphAddMemcpyNode, cudaGraphMemcpyNodeGetParams

template < class T >

__host__cudaError_t cudaLaunchCooperativeKernel ( T* func, dim3 gridDim, dim3 blockDim, void** args, size_t sharedMem = 0, cudaStream_t stream = 0 ) [inline]
启动设备函数。
Parameters
func
- 设备函数符号
gridDim
- 网格维度
blockDim
- 块维度
args
- 参数
sharedMem
- 共享内存(默认为 0)
stream
- 流标识符(默认为 NULL)
Description

该函数在func上调用内核gridDim (gridDim.xgridDim.ygridDim.z)网格的块。每个块包含blockDim (blockDim.xblockDim.yblockDim.z)线程。

调用此内核的设备必须具有设备属性 cudaDevAttrCooperativeLaunch 的非零值。

启动的块总数不能超过每个多处理器最大块数(由 cudaOccupancyMaxActiveBlocksPerMultiprocessor (或 cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags)返回)乘以设备属性 cudaDevAttrMultiProcessorCount 指定的多处理器数量。

内核不能使用 CUDA 动态并行性。

如果内核有 N 个参数,则args应指向 N 个指针的数组。每个指针,从args[0]args[N - 1],指向将从中复制实际参数的内存区域。

sharedMem设置每个线程块可用的动态共享内存量。

stream指定与调用关联的流。

Note

cudaLaunchCooperativeKernel (C API)

template < class T >

__host__cudaError_t cudaLaunchKernel ( T* func, dim3 gridDim, dim3 blockDim, void** args, size_t sharedMem = 0, cudaStream_t stream = 0 ) [inline]
启动设备函数。
Parameters
func
- 设备函数符号
gridDim
- 网格维度
blockDim
- 块维度
args
- 参数
sharedMem
- 共享内存(默认为 0)
stream
- 流标识符(默认为 NULL)
Description

该函数在func上调用内核gridDim (gridDim.xgridDim.ygridDim.z)网格的块。每个块包含blockDim (blockDim.xblockDim.yblockDim.z)线程。

如果内核有 N 个参数,则args应指向 N 个指针的数组。每个指针,从args[0]args[N - 1],指向将从中复制实际参数的内存区域。

sharedMem设置每个线程块可用的动态共享内存量。

stream指定与调用关联的流。

Note

cudaLaunchKernel (C API)

template < typename... ActTypes >

__host__cudaError_t cudaLaunchKernelEx ( const cudaLaunchConfig_t* config, const cudaKernel_t kernel, ActTypes &&... args ) [inline]
使用启动时配置启动 CUDA 函数。
Parameters
config
- 启动配置
kernel
args
- 内核参数的参数包
Description

调用内核kernel上调用内核config->gridDim (config->gridDim.xconfig->gridDim.yconfig->gridDim.z)网格的块。每个块包含config->blockDim (config->blockDim.xconfig->blockDim.yconfig->blockDim.z)线程。

config->dynamicSmemBytes设置每个线程块可用的动态共享内存量。

config->stream指定与调用关联的流。

超出网格和块维度、动态共享内存大小和流的配置可以使用config

config->attrs的以下两个字段提供config->numAttrscudaLaunchAttribute 元素的连续数组。如果config->numAttrs为零,则不考虑此指针的值。但是,在这种情况下,建议将指针设置为 NULL。config->numAttrs是填充第一个config->numAttrs位置的属性数量config->attrs数组。

内核参数应通过args参数包作为参数传递给此函数。

此函数的 C API 版本cudaLaunchKernelExC也可用于 pre-C++11 编译器以及在需要通过 void* 数组传递内核参数的用例中。

Note

另请参阅

cudaLaunchKernelEx (C API), cuLaunchKernelEx

template < typename... ExpTypes, typename... ActTypes >

__host__cudaError_t cudaLaunchKernelEx ( const cudaLaunchConfig_t* config, void(*)(ExpTypes...) kernel, ActTypes &&... args ) [inline]
使用启动时配置启动 CUDA 函数。
Parameters
config
- 启动配置
kernel
- 要启动的内核
args
- 内核参数的参数包
Description

调用内核kernel上调用内核config->gridDim (config->gridDim.xconfig->gridDim.yconfig->gridDim.z)网格的块。每个块包含config->blockDim (config->blockDim.xconfig->blockDim.yconfig->blockDim.z)线程。

config->dynamicSmemBytes设置每个线程块可用的动态共享内存量。

config->stream指定与调用关联的流。

超出网格和块维度、动态共享内存大小和流的配置可以使用config

config->attrs的以下两个字段提供config->numAttrscudaLaunchAttribute 元素的连续数组。如果config->numAttrs为零,则不考虑此指针的值。但是,在这种情况下,建议将指针设置为 NULL。config->numAttrs是填充第一个config->numAttrs位置的属性数量config->attrs数组。

内核参数应通过args参数包作为参数传递给此函数。

此函数的 C API 版本cudaLaunchKernelExC也可用于 pre-C++11 编译器以及在需要通过 void* 数组传递内核参数的用例中。

Note

另请参阅

cudaLaunchKernelEx (C API), cuLaunchKernelEx

template < class T >

__host__cudaError_t cudaLibraryGetGlobal ( T** dptr, size_t* bytes, cudaLibrary_t library, const char* name ) [inline]
返回全局设备指针。
Parameters
dptr
- 为请求的库返回的全局设备指针
bytes
- 返回的全局大小(以字节为单位)
library
- 从中检索全局变量的库
name
- 要检索的全局变量的名称
Description

*dptr*bytes请求的库的名称为name的全局变量的基本指针和大小library以及当前设备。如果请求的名称name不存在全局变量,则调用返回 cudaErrorSymbolNotFound。参数之一dptrbytes(不能同时为 NULL)可以为 NULL,在这种情况下,它将被忽略。

另请参阅

cudaLibraryLoadData, cudaLibraryLoadFromFile, cudaLibraryUnload, cudaLibraryGetManaged

template < class T >

__host__cudaError_t cudaLibraryGetManaged ( T** dptr, size_t* bytes, cudaLibrary_t library, const char* name ) [inline]
返回指向托管内存的指针。
Parameters
dptr
- 返回指向托管内存的指针
bytes
- 返回的内存大小(字节)
library
- 从哪个库检索托管内存
name
- 要检索的托管内存的名称
Description

*dptr*bytes具有指定名称的托管内存的基指针和大小name的全局变量的基本指针和大小library。 如果没有具有请求名称的托管内存name不存在全局变量,则调用返回 cudaErrorSymbolNotFound。参数之一dptrbytes(不能同时为 NULL),在这种情况下将被忽略。请注意,库的托管内存library在设备之间共享,并在库加载时注册。

另请参阅

cudaLibraryLoadData, cudaLibraryLoadFromFile, cudaLibraryUnload, cudaLibraryGetGlobal

template < class T >

__host__cudaError_t cudaLibraryGetUnifiedFunction ( T** fptr, cudaLibrary_t library, const char* symbol ) [inline]
返回指向统一函数的指针。
Parameters
fptr
- 返回指向统一函数的指针
library
- 从哪个库检索函数指针内存
symbol
- 要检索的函数指针的名称
Description

*fptr指向由以下项表示的统一函数的函数指针symbol。 如果不存在具有名称的统一函数symbol,则调用返回 cudaErrorSymbolNotFound。 如果系统中没有具有属性 cudaDeviceProp::unifiedFunctionPointers 的设备,则调用可能返回 cudaErrorSymbolNotFound

另请参阅

cudaLibraryLoadData, cudaLibraryLoadFromFile, cudaLibraryUnload

__host__cudaError_t cudaMallocAsync ( void** ptr, size_t size, cudaMemPool_t memPool, cudaStream_t stream )
从内存池分配。
Description

这是 cudaMallocFromPoolAsync 的另一种拼写方式,通过函数重载提供。

另请参阅

cudaMallocFromPoolAsync, cudaMallocAsync ( C API)

__host__cudaError_t cudaMallocHost ( void** ptr, size_t size, unsigned int  flags )
[C++ API] 在主机上分配页锁定内存
Parameters
ptr
- 指向已分配内存的设备指针
size
- 请求的分配大小(字节)
flags
- 请求的已分配内存的属性
Description

分配size字节的主机内存,该内存是页锁定的,并且设备可以访问。驱动程序跟踪使用此函数分配的虚拟内存范围,并自动加速对 cudaMemcpy() 等函数的调用。由于设备可以直接访问内存,因此与使用 malloc() 等函数获得的可分页内存相比,可以以更高的带宽读取或写入内存。分配过多的固定内存可能会降低系统性能,因为它减少了系统可用于分页的内存量。因此,此函数最好谨慎使用,以分配主机和设备之间数据交换的暂存区。

flags参数允许指定影响分配的不同选项,如下所示。

  • cudaHostAllocDefault:此标志的值定义为 0。

  • cudaHostAllocPortable:此调用返回的内存将被所有 CUDA 上下文视为固定内存,而不仅仅是执行分配的上下文。

  • cudaHostAllocMapped:将分配映射到 CUDA 地址空间。可以通过调用 cudaHostGetDevicePointer() 来获取指向内存的设备指针。

  • cudaHostAllocWriteCombined:将内存分配为写组合 (WC)。在某些系统配置中,WC 内存可以通过 PCI Express 总线更快地传输,但大多数 CPU 无法有效地读取 WC 内存。对于将由 CPU 写入并通过映射的固定内存或主机->设备传输由设备读取的缓冲区,WC 内存是一个不错的选择。

所有这些标志彼此正交:开发人员可以分配便携式、映射和/或写组合的内存,而没有任何限制。

cudaSetDeviceFlags() 必须已使用 cudaDeviceMapHost 标志调用,以便 cudaHostAllocMapped 标志生效。

对于不支持映射的固定内存的设备,可以在 CUDA 上下文中指定 cudaHostAllocMapped 标志。失败会延迟到 cudaHostGetDevicePointer(),因为内存可以通过 cudaHostAllocPortable 标志映射到其他 CUDA 上下文中。

由此函数分配的内存必须使用 cudaFreeHost() 释放。

Note

另请参阅

cudaSetDeviceFlags, cudaMallocHost ( C API), cudaFreeHost, cudaHostAlloc

template < class T >

__host__cudaError_t cudaMallocManaged ( T** devPtr, size_t size, unsigned int  flags = cudaMemAttachGlobal ) [inline]
分配将由统一内存系统自动管理的内存。
Parameters
devPtr
- 指向已分配设备内存的指针
size
- 请求的分配大小(字节)
flags
- 必须是 cudaMemAttachGlobalcudaMemAttachHost 之一(默认为 cudaMemAttachGlobal
Description

分配size设备上的托管内存字节数,并在*devPtr中返回指向已分配内存的指针。如果设备不支持分配托管内存,则返回 cudaErrorNotSupported。可以使用设备属性 cudaDevAttrManagedMemory 查询对托管内存的支持。分配的内存适当地对齐,可以用于任何类型的变量。内存未被清除。如果size为 0,则 cudaMallocManaged 返回 cudaErrorInvalidValue。该指针在 CPU 和系统中所有支持托管内存的 GPU 上均有效。对此指针的所有访问都必须遵守统一内存编程模型。

flags指定此分配的默认流关联。flags必须是 cudaMemAttachGlobalcudaMemAttachHost 之一。 的默认值为flagscudaMemAttachGlobal。 如果指定了 cudaMemAttachGlobal,则可以从任何设备上的任何流访问此内存。 如果指定了 cudaMemAttachHost,则不应从设备属性 cudaDevAttrConcurrentManagedAccess 的值为零的设备访问分配; 将需要显式调用 cudaStreamAttachMemAsync 以启用对此类设备的访问。

如果稍后通过 cudaStreamAttachMemAsync 将关联更改为单个流,则在销毁该流时,将恢复在 cudaMallocManaged 期间指定的默认关联。 对于 __managed__ 变量,默认关联始终为 cudaMemAttachGlobal。 请注意,销毁流是一个异步操作,因此,只有在该流中的所有工作完成后,才会发生更改为默认关联的情况。

使用 cudaMallocManaged 分配的内存应使用 cudaFree 释放。

对于设备属性 cudaDevAttrConcurrentManagedAccess 的值非零的 GPU,设备内存可能会过度分配。为了给其他分配腾出空间,统一内存驱动程序可以随时将此类 GPU 上的托管内存从设备内存中逐出到主机内存中。

在所有 GPU 的设备属性 cudaDevAttrConcurrentManagedAccess 的值均为非零的多 GPU 系统中,托管内存可能不会在此 API 返回时填充,而可能在访问时填充。 在此类系统中,托管内存可以随时迁移到任何处理器的内存中。 统一内存驱动程序将采用启发式方法来维护数据局部性,并在最大程度上防止过多的页错误。 应用程序还可以通过 cudaMemAdvise 指导驱动程序了解内存使用模式。 应用程序还可以通过 cudaMemPrefetchAsync 将内存显式迁移到所需的处理器内存。

在所有 GPU 的设备属性 cudaDevAttrConcurrentManagedAccess 的值为零,并且所有 GPU 彼此之间都具有对等支持的多 GPU 系统中,托管内存的物理存储在调用 cudaMallocManaged 时处于活动状态的 GPU 上创建。 所有其他 GPU 将通过 PCIe 总线上的对等映射以降低的带宽引用数据。 统一内存驱动程序不会在此类 GPU 之间迁移内存。

在并非所有 GPU 彼此之间都具有对等支持,并且设备属性 cudaDevAttrConcurrentManagedAccess 的值对于至少一个 GPU 为零的多 GPU 系统中,为托管内存选择的物理存储位置取决于系统。

  • 在 Linux 上,只要当前活动上下文集位于彼此具有对等支持或设备属性 cudaDevAttrConcurrentManagedAccess 的值非零的设备上,选择的位置将是设备内存。 如果 GPU 上存在活动上下文,该 GPU 的设备属性的值非零,并且它与其他具有活动上下文的设备不具有对等支持,则物理存储的位置将为“零复制”或主机内存。 请注意,这意味着如果在新 GPU 上创建不具有非零设备属性值且不支持与至少一个其他具有活动上下文的设备对等连接的上下文,则位于设备内存中的托管内存将迁移到主机内存。 这反过来意味着,如果主机内存不足以迁移所有托管分配,则上下文创建可能会失败。

  • 在 Windows 上,物理存储始终在“零复制”或主机内存中创建。 所有 GPU 将通过 PCIe 总线以降低的带宽引用数据。 在这种情况下,建议使用环境变量 CUDA_VISIBLE_DEVICES 来限制 CUDA 仅使用那些具有对等支持的 GPU。 或者,用户还可以将 CUDA_MANAGED_FORCE_DEVICE_ALLOC 设置为非零值,以强制驱动程序始终将设备内存用于物理存储。 当此环境变量设置为非零值时,该进程中使用的所有支持托管内存的设备都必须彼此对等兼容。 如果使用了支持托管内存的设备,但该设备与该进程中先前使用的任何其他支持托管内存的设备都不对等兼容,即使已在这些设备上调用了 cudaDeviceReset,也会返回错误 cudaErrorInvalidDevice。 这些环境变量在 CUDA 编程指南的“CUDA 环境变量”部分中进行了描述。

  • 在 ARM 上,Drive PX-2 的独立 GPU 上不提供托管内存。

Note

另请参阅

cudaMallocPitch, cudaFree, cudaMallocArray, cudaFreeArray, cudaMalloc3D, cudaMalloc3DArray, cudaMallocHost ( C API), cudaFreeHost, cudaHostAlloc, cudaDeviceGetAttribute, cudaStreamAttachMemAsync

template < class T >

cudaError_t cudaMemAdvise ( T* devPtr, size_t count, cudaMemoryAdvise advice, cudaMemLocation location ) [inline]
就给定内存范围的使用提供建议。
Description

这是 cudaMemAdvise 的另一种拼写方式,通过函数重载提供。

另请参阅

cudaMemAdvise, cudaMemAdvise (C API)

template < typename T, typename U >

__host__cudaError_t cudaMemcpyBatchAsync ( T** dsts, U** srcs, size_t* sizes, size_t count, cudaMemcpyAttributes attr, size_t* failIdx, cudaStream_t hStream ) [inline]
异步执行一批内存复制。
Description

这是 cudaMemcpyBatchAsync 的另一种拼写方式,通过函数重载提供。

attr指定的 cudaMemcpyAttributes 适用于批处理中指定的所有副本。

另请参阅

cudaMemcpyBatchAsync

template < typename T, typename U >

__host__cudaError_t cudaMemcpyBatchAsync ( T** dsts, U** srcs, size_t* sizes, size_t count, cudaMemcpyAttributes* attrs, size_t* attrsIdxs, size_t numAttrs, size_t* failIdx, cudaStream_t hStream ) [inline]
异步执行一批内存复制。
Description

这是 cudaMemcpyBatchAsync 的另一种拼写方式,通过函数重载提供。

另请参阅

cudaMemcpyBatchAsync

template < class T >

__host__cudaError_t cudaMemcpyFromSymbol ( void* dst, const T& symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost ) [inline]
[C++ API] 从设备上的给定符号复制数据
Parameters
dst
- 目标内存地址
symbol
- 设备符号引用
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

从内存区域复制count字节offset字节,从符号symbol的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。dst. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyDeviceToHostcudaMemcpyDeviceToDevice

Note
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数表现出 同步 行为。

  • 在 CUDA 4.1 中,不推荐使用字符串命名变量作为symbol参数,并在 CUDA 5.0 中删除。

  • 请注意,如果此调用尝试初始化内部 CUDA RT 状态,则此函数也可能返回 cudaErrorInitializationErrorcudaErrorInsufficientDrivercudaErrorNoDevice

  • 请注意,根据 cudaStreamAddCallback 的规定,不得从回调函数中调用任何 CUDA 函数。在这种情况下,可能会返回 cudaErrorNotPermitted 作为诊断信息,但这不能保证。

另请参阅

cudaMemcpy, cudaMemcpy2D, cudaMemcpy2DToArray, cudaMemcpy2DFromArray, cudaMemcpy2DArrayToArray, cudaMemcpyToSymbol, cudaMemcpyAsync, cudaMemcpy2DAsync, cudaMemcpy2DToArrayAsync, cudaMemcpy2DFromArrayAsync, cudaMemcpyToSymbolAsync, cudaMemcpyFromSymbolAsync

template < class T >

__host__cudaError_t cudaMemcpyFromSymbolAsync ( void* dst, const T& symbol, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyDeviceToHost, cudaStream_t stream = 0 ) [inline]
[C++ API] 从设备上的给定符号复制数据
Parameters
dst
- 目标内存地址
symbol
- 设备符号引用
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
stream
- 流标识符
Description

从内存区域复制count字节offset字节,从符号symbol的起始位置偏移

字节到

指向的内存区域。内存区域可能不重叠。dst. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyDeviceToHostcudaMemcpyDeviceToDevice

cudaMemcpyFromSymbolAsync() 相对于主机是异步的,因此调用可能在复制完成之前返回。 可以通过传递非零stream参数,选择性地将复制操作与流关联。 如果kindcudaMemcpyDeviceToHoststream为非零值,则复制操作可能与其他流中的操作重叠。

Note
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数都表现出 异步 行为。

  • 在 CUDA 4.1 中,不推荐使用字符串命名变量作为symbol参数,并在 CUDA 5.0 中删除。

  • 请注意,如果此调用尝试初始化内部 CUDA RT 状态,则此函数也可能返回 cudaErrorInitializationErrorcudaErrorInsufficientDrivercudaErrorNoDevice

  • 请注意,根据 cudaStreamAddCallback 的规定,不得从回调函数中调用任何 CUDA 函数。在这种情况下,可能会返回 cudaErrorNotPermitted 作为诊断信息,但这不能保证。

另请参阅

cudaMemcpy, cudaMemcpy2D, cudaMemcpy2DToArray, cudaMemcpy2DFromArray, cudaMemcpy2DArrayToArray, cudaMemcpyToSymbol, cudaMemcpyFromSymbol, cudaMemcpyAsync, cudaMemcpy2DAsync, cudaMemcpy2DToArrayAsync, cudaMemcpy2DFromArrayAsync, cudaMemcpyToSymbolAsync

template < class T >

__host__cudaError_t cudaMemcpyToSymbol ( const T& symbol, const void* src, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyHostToDevice ) [inline]
[C++ API] 将数据复制到设备上的给定符号
Parameters
symbol
- 设备符号引用
src
- 源内存地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
Description

从内存区域复制count指向的内存区域复制src到内存区域offset字节,从符号symbol. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyHostToDevicecudaMemcpyDeviceToDevice

Note
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数表现出 同步 行为。

  • 在 CUDA 4.1 中,不推荐使用字符串命名变量作为symbol参数,并在 CUDA 5.0 中删除。

  • 请注意,如果此调用尝试初始化内部 CUDA RT 状态,则此函数也可能返回 cudaErrorInitializationErrorcudaErrorInsufficientDrivercudaErrorNoDevice

  • 请注意,根据 cudaStreamAddCallback 的规定,不得从回调函数中调用任何 CUDA 函数。在这种情况下,可能会返回 cudaErrorNotPermitted 作为诊断信息,但这不能保证。

另请参阅

cudaMemcpy, cudaMemcpy2D, cudaMemcpy2DToArray, cudaMemcpy2DFromArray, cudaMemcpy2DArrayToArray, cudaMemcpyFromSymbol, cudaMemcpyAsync, cudaMemcpy2DAsync, cudaMemcpy2DToArrayAsync, cudaMemcpy2DFromArrayAsync, cudaMemcpyToSymbolAsync, cudaMemcpyFromSymbolAsync

template < class T >

__host__cudaError_t cudaMemcpyToSymbolAsync ( const T& symbol, const void* src, size_t count, size_t offset = 0, cudaMemcpyKind kind = cudaMemcpyHostToDevice, cudaStream_t stream = 0 ) [inline]
[C++ API] 将数据复制到设备上的给定符号
Parameters
symbol
- 设备符号引用
src
- 源内存地址
count
- 要复制的字节大小
offset
- 从符号起始位置的字节偏移量
kind
- 传输类型
stream
- 流标识符
Description

从内存区域复制count指向的内存区域复制src到内存区域offset字节,从符号symbol. The memory areas may not overlap.symbolis a variable that resides in global or constant memory space.kind可以是 cudaMemcpyHostToDevicecudaMemcpyDeviceToDevice

cudaMemcpyToSymbolAsync() 相对于主机是异步的,因此调用可能在复制完成之前返回。 可以通过传递非零值将复制操作与流关联stream参数,选择性地将复制操作与流关联。 如果kindcudaMemcpyHostToDevicestream为非零值,则复制操作可能与其他流中的操作重叠。

Note
  • 请注意,此函数也可能返回来自先前异步启动的错误代码。

  • 对于大多数用例,此函数都表现出 异步 行为。

  • 在 CUDA 4.1 中,不推荐使用字符串命名变量作为symbol参数,并在 CUDA 5.0 中删除。

  • 请注意,如果此调用尝试初始化内部 CUDA RT 状态,则此函数也可能返回 cudaErrorInitializationErrorcudaErrorInsufficientDrivercudaErrorNoDevice

  • 请注意,根据 cudaStreamAddCallback 的规定,不得从回调函数中调用任何 CUDA 函数。在这种情况下,可能会返回 cudaErrorNotPermitted 作为诊断信息,但这不能保证。

另请参阅

cudaMemcpy, cudaMemcpy2D, cudaMemcpy2DToArray, cudaMemcpy2DFromArray, cudaMemcpy2DArrayToArray, cudaMemcpyToSymbol, cudaMemcpyFromSymbol, cudaMemcpyAsync, cudaMemcpy2DAsync, cudaMemcpy2DToArrayAsync, cudaMemcpy2DFromArrayAsync, cudaMemcpyFromSymbolAsync

template < class T >

__host__cudaError_t cudaOccupancyAvailableDynamicSMemPerBlock ( size_t* dynamicSmemSize, T* func, int  numBlocks, int  blockSize ) [inline]
返回每个块在启动时可用的动态共享内存numBlocks在 SM 上的块。
Parameters
dynamicSmemSize
- 返回的最大动态共享内存
func
- 用于计算占用率的内核函数
numBlocks
- 适合在 SM 上的块数
blockSize
- 块的大小
Description

*dynamicSmemSize允许的动态共享内存的最大大小numBlocks每个 SM 的块。

Note

另请参阅

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

template < class T >

__host__cudaError_t cudaOccupancyMaxActiveBlocksPerMultiprocessor ( int* numBlocks, T func, int  blockSize, size_t dynamicSMemSize ) [inline]
返回设备函数的占用率。
Parameters
numBlocks
- 返回的占用率
func
- 用于计算占用率的内核函数
blockSize
- 内核计划启动的块大小
dynamicSMemSize
- 计划的每块动态共享内存使用量,以字节为单位
Description

*numBlocks设备函数的每个流式多处理器允许的最大活动块数。

Note

另请参阅

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < class T >

__host__cudaError_t cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags ( int* numBlocks, T func, int  blockSize, size_t dynamicSMemSize, unsigned int  flags ) [inline]
返回具有指定标志的设备函数的占用率。
Parameters
numBlocks
- 返回的占用率
func
- 用于计算占用率的内核函数
blockSize
- 内核计划启动的块大小
dynamicSMemSize
- 计划的每块动态共享内存使用量,以字节为单位
flags
- 占用率计算器的请求行为
Description

*numBlocks设备函数的每个流式多处理器允许的最大活动块数。

flags参数控制如何处理特殊情况。 有效的标志包括

  • cudaOccupancyDisableCachingOverride: 在全局缓存影响占用率的平台上,抑制默认行为。 在此类平台上,如果启用了缓存,但每块 SM 资源使用会导致零占用率,则占用率计算器将计算禁用缓存时的占用率。 设置此标志会使占用率计算器在这种情况下返回 0。 有关此功能的更多信息,请参见 Maxwell 调优指南的“Unified L1/Texture Cache”部分。

Note

另请参阅

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < class T >

__host__cudaError_t cudaOccupancyMaxActiveClusters ( int* numClusters, T* func, const cudaLaunchConfig_t* config ) [inline]
给定内核函数 (func) 和启动配置 (config),返回目标设备上可以共存的最大集群数,结果在*numClusters.
Parameters
numClusters
- 返回的目标设备上可以共存的最大集群数
func
- 用于计算最大集群数的内核函数
config
- 给定内核函数的启动配置
Description

如果函数已设置所需的集群大小(参见 cudaFuncGetAttributes),则配置中的集群大小必须是未指定的,或者与所需大小匹配。 如果没有所需大小,则必须在配置中指定集群大小,否则该函数将返回错误。

请注意,内核函数的各种属性可能会影响占用率计算。 运行时环境可能会影响硬件如何调度集群,因此无法保证计算出的占用率是可实现的。

Note

另请参阅

cudaFuncGetAttributes

template < class T >

__host__cudaError_t cudaOccupancyMaxPotentialBlockSize ( int* minGridSize, int* blockSize, T func, size_t dynamicSMemSize = 0, int  blockSizeLimit = 0 ) [inline]
返回为设备函数实现最大潜在占用率的网格大小和块大小。
Parameters
minGridSize
- 返回的实现最佳潜在占用率所需的最小网格大小
blockSize
- 返回的块大小
func
- 设备函数符号
dynamicSMemSize
- 计划的每块动态共享内存使用量,以字节为单位
blockSizeLimit
- 最大块大小func旨在与之配合使用。 0 表示没有限制。
Description

*minGridSize*blocksize建议的网格/块大小对,可实现最佳潜在占用率(即,最大数量的活动 warp 和最小数量的块)。

使用

另请参阅

cudaOccupancyMaxPotentialBlockSizeVariableSMem,如果每块动态共享内存量随不同的块大小而变化。

Note

另请参阅

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < typename UnaryFunction, class T >

__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeVariableSMem ( int* minGridSize, int* blockSize, T func, UnaryFunction blockSizeToDynamicSMemSize, int  blockSizeLimit = 0 ) [inline]
返回为设备函数实现最大潜在占用率的网格大小和块大小。
Parameters
minGridSize
- 返回的实现最佳潜在占用率所需的最小网格大小
blockSize
- 返回的块大小
func
- 设备函数符号
blockSizeToDynamicSMemSize
- 接受块大小并返回块所需的动态共享内存大小(以字节为单位)的一元函数/仿函数
blockSizeLimit
- 最大块大小func旨在与之配合使用。 0 表示没有限制。
Description

*minGridSize*blocksize建议的网格/块大小对,可实现最佳潜在占用率(即,最大数量的活动 warp 和最小数量的块)。

Note

另请参阅

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < typename UnaryFunction, class T >

__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags ( int* minGridSize, int* blockSize, T func, UnaryFunction blockSizeToDynamicSMemSize, int  blockSizeLimit = 0, unsigned int  flags = 0 ) [inline]
返回为设备函数实现最大潜在占用率的网格大小和块大小。
Parameters
minGridSize
- 返回的实现最佳潜在占用率所需的最小网格大小
blockSize
- 返回的块大小
func
- 设备函数符号
blockSizeToDynamicSMemSize
- 接受块大小并返回块所需的动态共享内存大小(以字节为单位)的一元函数/仿函数
blockSizeLimit
- 最大块大小func旨在与之配合使用。 0 表示没有限制。
flags
- 占用率计算器的请求行为
Description

*minGridSize*blocksize建议的网格/块大小对,可实现最佳潜在占用率(即,最大数量的活动 warp 和最小数量的块)。

flags参数控制如何处理特殊情况。 有效的标志包括

  • cudaOccupancyDisableCachingOverride: 此标志在全局缓存影响占用率的平台上,抑制默认行为。 在此类平台上,如果启用了缓存,但每块 SM 资源使用会导致零占用率,则占用率计算器将计算禁用缓存时的占用率。 设置此标志会使占用率计算器在这种情况下返回 0。 有关此功能的更多信息,请参见 Maxwell 调优指南的“Unified L1/Texture Cache”部分。

Note

另请参阅

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxPotentialBlockSizeWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < class T >

__host__cudaError_t cudaOccupancyMaxPotentialBlockSizeWithFlags ( int* minGridSize, int* blockSize, T func, size_t dynamicSMemSize = 0, int  blockSizeLimit = 0, unsigned int  flags = 0 ) [inline]
返回为具有指定标志的设备函数实现最大潜在占用率的网格大小和块大小。
Parameters
minGridSize
- 返回的实现最佳潜在占用率所需的最小网格大小
blockSize
- 返回的块大小
func
- 设备函数符号
dynamicSMemSize
- 计划的每块动态共享内存使用量,以字节为单位
blockSizeLimit
- 最大块大小func旨在与之配合使用。 0 表示没有限制。
flags
- 占用率计算器的请求行为
Description

*minGridSize*blocksize建议的网格/块大小对,可实现最佳潜在占用率(即,最大数量的活动 warp 和最小数量的块)。

flags参数控制如何处理特殊情况。 有效的标志包括

  • cudaOccupancyDisableCachingOverride: 此标志在全局缓存影响占用率的平台上,抑制默认行为。 在此类平台上,如果启用了缓存,但每块 SM 资源使用会导致零占用率,则占用率计算器将计算禁用缓存时的占用率。 设置此标志会使占用率计算器在这种情况下返回 0。 有关此功能的更多信息,请参见 Maxwell 调优指南的“Unified L1/Texture Cache”部分。

使用

另请参阅

cudaOccupancyMaxPotentialBlockSizeVariableSMem,如果每块动态共享内存量随不同的块大小而变化。

Note

另请参阅

cudaOccupancyMaxPotentialBlockSize

cudaOccupancyMaxActiveBlocksPerMultiprocessor

cudaOccupancyMaxActiveBlocksPerMultiprocessorWithFlags

cudaOccupancyMaxPotentialBlockSizeVariableSMem

cudaOccupancyMaxPotentialBlockSizeVariableSMemWithFlags

cudaOccupancyAvailableDynamicSMemPerBlock

template < class T >

__host__cudaError_t cudaOccupancyMaxPotentialClusterSize ( int* clusterSize, T* func, const cudaLaunchConfig_t* config ) [inline]
给定内核函数 (func) 和启动配置 (config),返回最大集群大小,结果在*clusterSize.
Parameters
clusterSize
- 返回的可以为给定的内核函数和启动配置启动的最大集群大小
func
- 用于计算最大集群大小的内核函数
config
- 给定内核函数的启动配置
Description

中的集群维度config将被忽略。 如果 func 已设置所需的集群大小(参见 cudaFuncGetAttributes),*clusterSize将反映所需的集群大小。

默认情况下,此函数将始终返回一个在未来硬件上可移植的值。 如果内核函数允许不可移植的集群大小,则可能会返回更高的值。

此函数将遵循编译时启动边界。

Note

另请参阅

cudaFuncGetAttributes

template < class T >

__host__cudaError_t cudaStreamAttachMemAsync ( cudaStream_t stream, T* devPtr, size_t length = 0, unsigned int  flags = cudaMemAttachSingle ) [inline]
异步地将内存附加到流。
Parameters
stream
- 在其中排队附加操作的流
devPtr
- 指向内存的指针(必须是指向托管内存的指针或指向系统分配内存的有效主机可访问区域的指针)
length
- 内存长度(默认为零)
flags
- 必须是 cudaMemAttachGlobalcudaMemAttachHostcudaMemAttachSingle 之一(默认为 cudaMemAttachSingle
Description

stream中排队一个操作,以指定从length开始的devPtr字节内存的流关联。 此函数是流序操作,这意味着它依赖于流中先前完成的工作,并且仅在流中先前完成的工作完成后才会生效。 任何先前的关联都会自动替换。

devPtr必须指向以下类型内存之一

  • 使用 __managed__ 关键字声明或使用 cudaMallocManaged 分配的托管内存。

  • 系统分配的可分页内存的有效主机可访问区域。 仅当与流关联的设备报告设备属性 cudaDevAttrPageableMemoryAccess 的非零值时,才可以指定此类型的内存。

对于托管分配,length必须为零或整个分配的大小。 两者都表示正在更改整个分配的流关联。 目前,无法更改托管分配的一部分的流关联。

对于可分页分配,length必须为非零。

流关联是使用flags指定的,它必须是 cudaMemAttachGlobalcudaMemAttachHostcudaMemAttachSingle 之一。 的默认值为flagscudaMemAttachSingle。 如果指定了 cudaMemAttachGlobal 标志,则任何设备上的任何流都可以访问内存。 如果指定了 cudaMemAttachHost 标志,则程序保证不会从设备属性 cudaDevAttrConcurrentManagedAccess 的值为零的设备上的任何流访问设备上的内存。 如果指定了 cudaMemAttachSingle 标志并且stream与设备属性 cudaDevAttrConcurrentManagedAccess 的值为零的设备关联,则程序保证它只会从stream访问设备上的内存。 单独附加到 NULL 流是非法的,因为 NULL 流是虚拟全局流,而不是特定流。 在这种情况下将返回错误。

当内存与单个流关联时,只要stream中的所有操作都已完成,统一内存系统将允许 CPU 访问此内存区域,而不管其他流是否处于活动状态。 实际上,这会将活动 GPU 对托管内存区域的独占所有权限制为每个流的活动,而不是整个 GPU 的活动。

从与其不关联的流访问设备上的内存将产生未定义的結果。 统一内存系统不执行错误检查,以确保启动到其他流中的内核不访问此区域。

程序有责任通过事件、同步或其他方式对 cudaStreamAttachMemAsync 的调用进行排序,以确保始终合法访问内存。 对于所有遵循流关联更改的内核,数据可见性和一致性将得到适当的更改。

如果stream在数据与之关联时被销毁,则关联将被删除,并且关联将恢复为 cudaMallocManaged 中指定的分配的默认可见性。 对于 __managed__ 变量,默认关联始终为 cudaMemAttachGlobal。 请注意,销毁流是一个异步操作,因此,在流中的所有工作完成之前,不会发生更改为默认关联的操作。

Note

另请参阅

cudaStreamCreate, cudaStreamCreateWithFlags, cudaStreamWaitEvent, cudaStreamSynchronize, cudaStreamAddCallback, cudaStreamDestroy, cudaMallocManaged