主要内容

运行包含CUDA代码的mex函数

编写一个包含CUDA代码的mex文件

与任何包含CUDA的mex文件一样®代码有一个入口点,称为mexFunction。mex -函数包含与MATLAB中的gpuArray对象交互的主机端代码®并启动CUDA代码。mex文件中的CUDA代码必须符合CUDA运行时API。

你应该调用这个函数mxInitGPU在你的mex文件的入口。这确保了GPU设备的正确初始化和MATLAB知道。

用于为gpuArray对象编写MEX-file的接口与用于标准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) B[i] = 0 * A[i];}

它包含以下几行来确定数组的大小并启动一个合适大小的网格:

N = (int) (mxGPUGetNumberOfElements (A));blockspgrid = (N + threadsPerBlock - 1) / threadsPerBlock;TimesTwo<<< blockspgrid, threadsPerBlock>>>(d_A, d_B, N); / /阻塞阻塞

运行生成的MEX-Functions

本例中的MEX-function将输入数组中的每个元素都乘以2以获得输出数组中的值。要测试它,从一个gpuArray开始,其中每个元素都是1:

x = 1 (4 4“gpuArray”);y = mexGPUExample (x)
y = 2 2 2 2 2 2 2 2 2 2 2 2 2

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

disp ([“阶级(x) =”类(x),', class(y) = '、类(y)])
class(x) = gpuArray, class(y) = gpuArray

与CUDA内核比较

并行计算工具箱也支持金宝appCUDAKernel对象,可以用来集成CUDA代码与MATLAB。在选择MEX-file方法和CUDAKernel方法:

  • MEX-files可以与主机端库交互,比如NVIDIA性能原语(NPP)或CUFFT库,还可以包含主机对CUDA运行时库中的函数的调用。

  • MEX-files可以分析输入的大小,并从C或c++代码中分配不同大小的内存,或启动不同大小的网格。相比之下,MATLAB代码调用CUDAKernel对象必须预先分配输出内存并确定网格大小。

复杂数据的访问

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

根据内核的需要,可以将指向复杂数据的指针转换为real类型或内置vector类型。例如,在MATLAB中,假设你创建了一个矩阵:

=复杂(的(4‘gpuArray’)的(4 ' gpuArray '));

如果你将一个gpuArray传递给MEX-function作为第一个参数(prhs[0]),那么你可以通过调用得到一个指向复杂数据的指针:

mxGPUArray const * A = mxgucreatefrommxarray (prhs[0]);mwSize numel_complex = mxGPUGetNumberOfElements(A);* d_A = (const *)(mxGPUGetDataReadOnly(A));

要将数组视为长度为其两倍的真正双精度数组,可以这样做:

mxGPUArray const * A = mxgucreatefrommxarray (prhs[0]);mwSize numel_real = 2 * mxGPUGetNumberOfElements(一个);double * d_A = (double const *)(mxGPUGetDataReadOnly(A));

在GPU上存在各种功能来转换复杂格式和真实格式之间的数据。这些操作需要一个副本来交替使用数据。这个函数mxGPUCreateComplexGPUArray获取两个真正的mxGPUArray,并交错它们的元素以生成一个相同长度的复杂mxGPUArray。的函数mxGPUCopyRealmxGPUCopyImag每个都将实元素或虚元素复制到新的实mxGPUArray中。(没有等同的mxGetImagData函数的mxGPUArray对象。)

编译GPU的mex文件

要编译CUDA代码,您必须安装与ToolkitVersion财产的gpuDevice对象。

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

mexcudamexGPUExample.cu

如果mexcuda定位NVIDIA编译器有困难(学校网站),它可能安装在非默认位置。您可以指定位置学校网站通过将它存储在环境变量中MW_NVCC_PATH。您可以使用MATLAB设置这个变量setenv命令。例如,

setenv (“MW_NVCC_PATH”,“/ usr /地方/ CUDA / bin”)

只是Visual Studio的一个子集®mexcuda支持编译器。金宝app有关详情,请参阅英伟达工具包的文档

相关的话题