运行MEX-功能包含CUDA代码

写MEX-文件包含CUDA代码

正如任何MEX-文件,那些含有CUDA®码有一个单一的入口点,被称为mexFunction。该MEX-功能包含主机端代码与gpuArray相互作用从MATLAB对象®并推出了CUDA代码。在MEX文件的CUDA代码必须符合CUDA运行时API。

你应该调用函数mxInitGPU在进入到您的MEX文件。这可确保GPU设备正常初始化,已知MATLAB。

你用写一个MEX文件的gpuArray对象的接口是从MEX接口标准MATLAB阵列的不同。

你可以看到一个包含CUDA代码在MEX文件的例子:

该文件包含以下CUDA设备功能:

空隙__global__ TimesTwo(双常量* const的A,双* const的B,INT常量N){INT I = blockDim.x * blockIdx.x + threadIdx.x;如果(ⅰ
            

它包含以下行确定数组大小并启动​​适当大小的网格:

N =(int)的(mxGPUGetNumberOfElements(A));blocksPerGrid =(N + threadsPerBlock  -  1)/ threadsPerBlock;TimesTwo <<< blocksPerGrid,threadsPerBlock >>>(D_A,D_B,N);

运行结果MEX-功能

在这个例子中乘以MEX-功能由2输入数组中的每个元素,以获得输出数组中的值。要测试,开始与gpuArray,其中每个元素是1:

X =酮(4,4,'gpuArray');Y = mexGPUExample(x)的
Y = 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

输入和输出数组是gpuArray对象:

DISP(['类(X)=',类(x)的'类(Y)=',类(Y)])
类(X)= gpuArray,类(Y)= gpuArray

相比于CUDA内核

并行计算工具箱还支持万博1manbetxCUDAKernel可用于CUDA代码MATLAB整合的对象。选择MEX文件的方法兑时,请考虑以下CUDAKernel做法:

  • MEX-文件可以与主机端库,如NVIDIA性能基元(NPP)或CUFFT库进行互动,也可以包含来自主机功能,在CUDA运行时库调用。

  • MEX-文件可以分析输入的尺寸和分配不同尺寸的存储器,或不同尺寸的发射网格,由C或C ++代码。相比之下,MATLAB代码调用CUDAKernel对象必须预先分配输出存储器和确定网格尺寸。

访问复杂的数据

一个GPU设备上复杂的数据被存储在交错的复杂格式。也就是说,对于一个复杂gpuArray一个,元件的实部和虚部一世存储在连续地址。MATLAB使用CUDA内置向量类型复杂数据存储在设备上(见NVIDIA CUDA C编程指南)。

根据你的内核的需求,您可以转换指针到复杂的数据作为真正的类型或内置向量类型。例如,在MATLAB,假设你创建了一个矩阵:

一个=络合物(酮(4, 'gpuArray'),酮(4, 'gpuArray'));

如果传递一个gpuArray到MEX-函数作为第一个参数(prhs [0]),则可以通过使用调用获得的指针复杂的数据:

mxGPUArray常量* A = mxGPUCreateFromMxArray(prhs [0]);mwSize numel_complex = mxGPUGetNumberOfElements(A);double2 * D_A =(double2常量*)(mxGPUGetDataReadOnly(A));

对待数组长度两倍的真正双精度数组,你可以这样来做:

mxGPUArray常量* A = mxGPUCreateFromMxArray(prhs [0]);mwSize numel_real = 2个* mxGPUGetNumberOfElements(A);双* D_A =(双常量*)(mxGPUGetDataReadOnly(A));

各种功能存在复杂而真实的格式之间的数据转换的GPU。这些操作需要一个副本交错的数据。功能mxGPUCreateComplexGPUArray需要两个真实mxGPUArrays和交织它们的元素,以产生具有相同长度的单个复mxGPUArray。功能mxGPUCopyRealmxGPUCopyImag每个副本无论是真实的或假想的元件到一个新的真实mxGPUArray。(没有等同的mxGetImagData功能mxGPUArray对象。)

编译GPU MEX-文件

要编译CUDA代码,您必须安装CUDA工具包版本一致ToolkitVersion财产gpuDevice目的。

使用mexcuda在MATLAB命令编译包含CUDA代码MEX-文件。您可以使用以下命令编译示例文件:

mexcudamexGPUExample.cu

如果mexcuda具有定位NVIDIA编译器的麻烦(NVCC),它可以安装在非默认位置。您可以指定的位置NVCC系统通过将其存储在环境变量上MW_NVCC_PATH。您可以使用MATLAB设置此变量SETENV命令。例如,

SETENV('MW_NVCC_PATH''在/ usr /本地/ CUDA /箱'

只有Visual Studio中的一个子集®编译器的支持mexcuda万博1manbetx。有关详细信息,请参阅NVIDIA工具包文档

相关话题