与任何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函数将输入数组中的每个元素乘以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
并行计算工具箱™也支持万博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。功能MXGPUCOPOPEREL
和mxgpucopyimag
每个副本将真实的元素或虚构元素复制成新的真实MXGPUARRAY。(没有等效的mxgetimagdata
MXGPUARRAY对象的功能。)
使用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工具包文档。