正如任何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-功能由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
并行计算工具箱还支持万博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。功能mxGPUCopyReal
和mxGPUCopyImag
每个副本无论是真实的或假想的元件到一个新的真实mxGPUArray。(没有等同的mxGetImagData
功能mxGPUArray对象。)
要编译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工具包文档。