主要内容

运行包含CUDA代码的MEX-Functions

写一个包含CUDA代码的MEX-File

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

你应该调用这个函数mxInitGPU在你的墨西哥文件的入口。这确保了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 + threadaddx;if (i < N) B[i] = 2.0 * A[i];}

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

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

运行生成的MEX-Functions

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

X = ones(4,4,“gpuArray”);y = mexGPUExample(x)
Y = 2 2 2 2 2 2 2 2

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

disp ([class(x) = '类(x),, class(y) = '、类(y)])
class(x) = gpuArray, class(y) = gpuArray

与CUDA内核的比较

并行计算工具箱™也支持CUDAKernel可用于将CUDA代码与MATLAB集成的对象。你可以创建CUDAKernel对象使用CU和PTX文件。通常,使用MEX-files比使用CUDAKernel对象:

  • 墨西哥文件可以包括对主机端库的调用,包括NVIDIA®例如NVIDIA性能原语(NPP)或cuFFT库。墨西哥文件还可以包含从主机到CUDA运行时库中的函数的调用。

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

访问复杂数据

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

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

a = complex(ones(4,'gpuArray'),ones(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获取两个实际的mxGPUArray,并将它们的元素交叉生成一个相同长度的复杂mxGPUArray。的函数mxGPUCopyReal而且mxGPUCopyImag每次将实元素或虚元素复制到一个新的实mxGPUArray中。(没有对等的mxGetImagData函数用于mxGPUArray对象。)

编译一个GPU MEX-File

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

mexcudamexGPUExample.cu

如果未检测到CUDA工具包或不支持的版本,MATLAB将使用NVIDIA编译CUDA代码学校网站编译器安装MATLAB。检查哪个编译器mexcuda是用,是用- v属性中的详细输出mexcuda命令。

与MATLAB一起安装的CUDA工具包不包含CUDA工具包中可用的所有库。如果您想链接一个没有安装MATLAB的特定库,请安装CUDA工具包。您可以查看MATLAB需要使用哪个CUDA工具包版本gpuDevice.有关CUDA工具包的更多信息,请参见CUDA工具包要求

如果mexcuda无法定位NVIDIA编译器(学校网站)在您安装的CUDA工具包中,它可能安装在非默认位置。的位置学校网站把它存储在环境变量中MW_NVCC_PATH.您可以使用MATLAB设置此变量setenv命令。例如,

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

只是Visual Studio的一个子集®mexuda支持编译器。详情请参阅NVIDIA工具包文档

另请参阅

||

相关的话题

Baidu
map