主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

parallel.gpu.CUDAKernel

GPU 上的内核可执行文件

说明

CUDAKernel 对象表示可以在 GPU 上执行的 CUDA 内核。您可以从 CU 和 PTX 文件创建内核。有关如何创建和使用 CUDAKernel 对象的示例,请参阅 在 GPU 上运行 CUDA 或 PTX 代码

注意

您不能 saveload CUDAKernel 对象。

创建对象

描述

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile) 使用 PTX 代码 ptxFile 和 CUDA® 源文件 cuFile 创建 CUDAKernel 对象。PTX 文件必须只包含一个入口点。

使用 fevalkern 作为输入在 GPU 上执行 CUDA 内核。有关执行内核对象的信息,请参阅 运行 CUDAKernel

示例

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile,func)func 定义的函数入口点创建 CUDAKernelfunc 必须在 PTX 文件中明确定义适当的内核入口点。

示例

kern = parallel.gpu.CUDAKernel(ptxFile,cProto) 使用 PTX 文件 ptxFile 和 C 原型 cProto 创建 CUDAKernel 对象。cProtokern 所代表的内核调用的 C 函数原型。PTX 文件必须只包含一个入口点。

示例

kern = parallel.gpu.CUDAKernel(ptxFile,cProto,func) 从 PTX 文件和 C 原型为 func 定义的函数入口点创建 CUDAKernel 对象。func 必须在 PTX 文件中明确定义适当的内核入口点。

输入参量

全部展开

PTX 文件或 PTX 代码的名称。

您可以提供 PTX 文件的名称,或将其内容作为字符串传递。

示例: "simpleEx.ptx"

数据类型: char | string

CUDA 源文件的名称,指定为字符向量。

该函数检查 CUDA 源文件以找到 PTX 代码中定义的 CUDA 内核的函数原型。CUDA 源文件必须包含以 '__global__' 开头的内核定义。

示例: "simpleEx.cu"

数据类型: char | string

函数入口点,指定为字符向量。func 必须在 PTX 文件中明确定义相应的入口点。

注意

parallel.gpu.CUDAKernel 函数在 PTX 文件中搜索指定的入口点,并匹配任何子字符串出现的位置。因此,您不应将任何入口点命名为任何其他入口点的子字符串。

示例: "add1"

数据类型: char | string

内核调用的 C 原型,指定为字符向量。指定多个输入参量,以逗号分隔。

示例: "float *,float,int"

数据类型: char | string

属性

全部展开

内核上线程块的大小,指定为长度为 1、2 或 3 的正整数向量(因为线程块最多可以有 3 维)。对于此内核,ThreadBlockSize 元素的乘积不得超过 MaxThreadsPerBlock,并且 ThreadBlockSize 的任何元素都不能超过 GPUDevice 属性 MaxThreadBlockSize 的对应元素。

示例: [8 8 8]

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

此 属性 为只读。

此 CUDA 内核的单个块中允许的最大线程数。ThreadBlockSize 元素的乘积不得超过该值。

示例: 1024

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

线程块网格的大小,指定为长度为 3 的整数向量。这实际上是 GPU 独立启动的线程块的数量。该向量的任何元素都不能超过 GPUDevice 对象的 MaxGridSize 属性的向量中对应元素。

示例: [977 1 1]

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

每个线程块可以使用的动态共享内存量(以字节为单位)。每个线程块都有一个可用的共享内存区域。该内存与多处理器上的寄存器共享。SharedMemorySize 不得超过 GPUDevice 对象的 MaxShmemPerBlock 属性。

与所有内存一样,这需要在内核启动之前分配。通常,此共享内存区域的大小与线程块的大小相关。在内核上设置此值可确保块中的每个线程都可以访问这个可用的共享内存区域。

示例: 16000

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

此 属性 为只读。

内核调用的 PTX 代码中的入口点名称。

示例: "_Z13returnPointerPKfPy"

数据类型: char | string

此 属性 为只读。

内核支持的左侧参量的最大数量。它不能大于右侧参量的数量,并且如果任何输入是常数或标量,它将会更小。

示例: 1

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

此 属性 为只读。

调用此内核所需的右侧参量的数量。所有输入都需要定义输入的标量值、向量输入/输出的元素或输出参量的大小。

示例: 5

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

此 属性 为只读。

长度为 NumRHSArguments 的字符向量元胞数组。每个字符向量通过指定数值类型(例如 uint8singledouble 后跟单词 scalarvector)来指示该输入的预期 MATLAB® 数据类型,以指示我们是通过引用还是值传递。此外,如果该参量仅仅是内核的输入,则以 in 为前缀;如果它是输入/输出,则以 inout 为前缀。这使您可以决定如何使用 MATLAB 数组和 gpuArray 对象有效地调用内核,并查看哪些内核输入被视为输出。

示例: {'inout double vector'} {'in double vector'} {'in double vector'} {'in uint32 scalar'} {'in uint32 scalar'}

数据类型: cell

对象函数

feval在 GPU 上评估内核
setConstantMemory在 GPU 上设置一些常量内存
existsOnGPU确定 GPU 上是否提供 gpuArray 或 CUDAKernel

示例

全部折叠

此示例显示如何使用 PTX 文件和 CU 文件或使用 PTX 文件和函数原型创建 CUDAKernel 对象。

CUDA 源文件 simpleEx.cu 包含以下代码:

/*
* Add a constant to a vector.
*/
__global__ void addToVector(float * pi, float c, int vecLen)  {
   int idx = blockIdx.x * blockDim.x + threadIdx.x;
   if (idx < vecLen) {
       pi[idx] += c;
   }
}

使用 mexcuda-ptx 选项将 CU 文件编译为 PTX 文件。

mexcuda -ptx simpleEx.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

使用 PTX 文件和 CU 文件创建 CUDA 内核。

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","simpleEx.cu");

使用 PTX 文件和 addToVector 函数的函数原型创建 CUDA 内核。

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","float *,float,int");

上述两个语句都返回一个内核对象,您可以使用该对象调用 addToVector CUDA 内核。

此示例显示如何从具有多个入口点的 PTX 文件创建 CUDAKernel 对象。

假设您的 CU 文件 myfun.cu 包含一个用于将两个双精度数相加的函数 add1 和一个用于将两个向量相加的函数 add2

__global__ void add1( double * a, double b ) 
{
    *a += b;
}

__global__ void add2( double * v1, const double * v2 ) 
{
    int idx = threadIdx.x;
    v1[idx] += v2[idx];
}

使用 mexcuda-ptx 选项将 CU 文件编译为 PTX 文件。

mexcuda -ptx myfun.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

PTX 文件包含两个分别对应 add1add2 函数的入口点。当您的 PTX 代码包含多个入口点时,您必须在创建内核时指定一个入口。

创建一个用于将两个双精度数相加的内核,并指定入口点 add1

k = parallel.gpu.CUDAKernel("myfun.ptx","myfun.cu","add1");

版本历史记录

在 R2010b 中推出