运行包含CUDA代码的MEX-Functions
写一个包含CUDA代码的MEX-File
与任何墨西哥文件一样,包含CUDA的文件®代码有一个单一的入口点,称为mexFunction
.mex -函数包含与MATLAB中的gpuArray对象交互的主机端代码®并启动CUDA代码。墨西哥文件中的CUDA代码必须符合CUDA运行时API。
你应该调用这个函数mxInitGPU
在你的墨西哥文件的入口。这确保了GPU设备被正确地初始化并为MATLAB所知。
用于为gpuArray对象编写MEX文件的接口不同于标准MATLAB数组的MEX接口。
你可以看到一个包含CUDA代码的mex文件的例子:
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工具包文档.