主要内容

运行包含CUDA代码的MEX功能

写一个包含CUDA代码的MEX文件

与任何MEX文件一样,那些包含Cuda®代码具有一个切入点,称为mexfunction。MEX功能包含与MATLAB与GPUARRAY对象交互的主机端代码®并启动CUDA代码。MEX文件中的CUDA代码必须符合CUDA运行时API。

您应该调用功能mxinitgpu在您的MEX文件进入时。这样可以确保适当初始化GPU设备并已知MATLAB。

您用来编写用于GPUARRAY对象的MEX文件的界面与标准MATLAB数组的MEX接口不同。

您可以看到一个包含CUDA代码的MEX文件的示例:

该文件包含以下CUDA设备函数:

void __global __ Timestwo(double const * const a,double * const b,int const n){int i = blockdim.x * blockIdx.x + threadIdx.x;if(i 
            

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

n =(int)(mxgpugetnumberofelements(a));blockspergrid =(n + threadsperblock -1) / threadsperblock;timestwo <<< blockspergrid,threadsperblock >>>(d_a,d_b,n);

运行由此产生的MEX函数

此示例中的MEX函数将输入数组中的每个元素乘以2,以获取输出数组中的值。要测试它,请从每个元素为1:的gpuarray开始

x =一个(4,4,'gpuarray');y = mexgpuexample(x)
y = 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

输入和输出数组都是GPUARRAY对象:

disp([['class(x)=',类(x),',class(y)=',班级(y)])
class(x)= gpuarray,class(y)= gpuarray

与CUDA内核进行比较

并行计算工具箱™也支持万博1manbetxCudakernel可用于将CUDA代码与MATLAB集成的对象。您可以创建Cudakernel使用CU和PTX文件的对象。通常,使用mex-files比使用更灵活Cudakernel对象:

  • Mex-Files可以包括呼叫到主机侧库,包括NVIDIA®诸如NVIDIA性能原始图(NPP)或CUFFT库之类的库。Mex-Files还可以包含从主机到CUDA运行时库中功能的呼叫。

  • Mex-Files可以分析输入的大小,并分配不同大小的内存,或启动与C或C ++代码不同大小的网格。相比之下,调用MATLAB代码Cudakernel对象必须在输出内存中进行预先分配并确定网格大小。

访问复杂数据

GPU设备上的复杂数据以交织的复杂格式存储。也就是说,对于一个复杂的gpuarray一个,元素的真实和虚构部分一世存储在连续地址中。MATLAB使用CUDA内置矢量类型将复杂的数据存储在设备上(请参阅NVIDIA CUDA C编程指南)。

根据内核的需求,您可以将指针铸造为“实际类型”或“内置向量类型”。例如,在MATLAB中,假设您创建以下矩阵:

a =复杂(一个,(4,'gpuarray'),一个(4,'gpuarray'));

如果将GPUARRAY传递到MEX函数作为第一个参数(PRHS [0]),则可以通过使用呼叫来获取复杂数据的指针:

mxgpuarray const * a = mxgpucreatefrommxarray(prhs [0]);mwsize numel_complex = mxgPugetNumberofelements(a);double2 * d_a =(double2 const *)(mxgpugetDataReadonly(a));

要将阵列视为两倍长度的真正双重精度阵列,您可以这样做:

mxgpuarray const * a = mxgpucreatefrommxarray(prhs [0]);mwsize numel_real = 2*mxgpugetnumberofelements(a);double * d_a =(double const *)(mxgPugetDataReadonly(a));

存在各种功能,可以在GPU上的复杂格式和真实格式之间转换数据。这些操作需要副本来交流数据。功能mxgpucreatecomplexgpuarray采用两个真实的mxgpuarrays,并交织它们的元素以产生相同长度的单个复杂的MXGPUARRAY。功能MXGPUCOPOPERELmxgpucopyimag每个副本将真实的元素或虚构元素复制成新的真实MXGPUARRAY。(没有等效的mxgetimagdataMXGPUARRAY对象的功能。)

编译GPU MEX文件

使用Mexcuda在MATLAB中命令以编译包含CUDA代码的MEX文件。您可以使用命令来编译示例文件:

Mexcudamexgpuexample.cu

如果未检测到CUDA工具包或不受支持的版本,则MATLAB使用NVIDIA编译CUDA代码万博1manbetxNVCC与MATLAB安装的编译器。检查哪个编译器Mexcuda正在使用,使用-v标记为详细输出Mexcuda命令。

使用MATLAB安装的CUDA工具包不包含CUDA工具包中可用的所有库。如果要链接未使用MATLAB安装的特定库,请安装CUDA工具包。您可以检查哪个CUDA工具包MATLAB需要使用gpudevice。有关CUDA工具包的更多信息,请参见CUDA工具包

如果Mexcuda在找到NVIDIA编译器时遇到困难(NVCC)在您安装的CUDA工具包中,它可以安装在非默认位置。您可以指定NVCC通过将其存储在环境变量中来在您的系统上mw_nvcc_path。您可以使用MATLAB设置此变量setenv命令。例如,

setenv('mw_nvcc_path',,,,'/usr/local/cuda/bin'

仅视觉工作室的一部分®编译器得到了Mexcuda万博1manbetx的支持。有关详细信息,请咨询NVIDIA工具包文档

也可以看看

||

相关话题