主要内容

运行包含CUDA MEX-Functions代码

编写包含CUDA MEX-File代码

对于任何mex files,包含CUDA的那些®代码有一个单一入口点,称为mexFunction。代码问题吗?看看交换机MEX-function包含日志从MATLAB与gpuArray交互对象®并启动CUDA的代码。CUDA代码在CUDA MEX-file必须符合运行时API。

你应该调用的函数mxInitGPU在进入你的MEX-file。这确保了GPU设备正确初始化和MATLAB。

您所使用的接口编写MEX-file gpuArray对象不同于墨西哥人接口标准MATLAB数组。

你可以看到一个包含CUDA MEX-file代码:

这个文件包含以下CUDA设备功能:

空白__global__ TimesTwo(双const *常量,双* const B, int const N) {int i = blockDim。x * blockIdx。x + threadIdx.x;如果(我< N) B[我]= 2.0 *(我);}

它包含以下行来确定数组大小和启动一个网格的尺寸:

N = (int) (mxGPUGetNumberOfElements (A));blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;TimesTwo < < < blocksPerGrid 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 2 2 2

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

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

相比一个CUDA的内核

并行计算工具箱™也支持金宝appCUDAKernel对象可用于集成CUDA和MATLAB代码。您可以创建CUDAKernel使用铜和PTX文件对象。一般来说,使用mex files比使用更灵活CUDAKernel对象:

  • mex files库问题吗?看看交换机可以包括调用日志,包括NVIDIA®库如NVIDIA表现原语(NPP)或cuFFT库。mex files也可以包含调用从主机CUDA运行时库函数。

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

复杂数据的访问

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

根据您的内核的需要,您可以把复杂的数据指针一样真正的类型或内置的向量类型。例如,在MATLAB,假设您创建以下矩阵:

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

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

mxGPUArray const * = mxGPUCreateFromMxArray (prhs [0]);mwSize numel_complex = mxGPUGetNumberOfElements(一个);double2 * d_A = (double2 const *) (mxGPUGetDataReadOnly (A));

将数组作为一个真正的双精度的数组长度的两倍,你可以这样做:

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

各种功能存在复杂和真实之间转换数据格式在GPU上。这些操作需要一个交错数据副本。这个函数mxGPUCreateComplexGPUArray需要两个真正mxGPUArrays上面的元素来生成一个复杂mxGPUArray长度相同。的函数mxGPUCopyRealmxGPUCopyImag每一个真实或虚构的元素复制到一个新的真正的mxGPUArray。(没有的mxGetImagData函数mxGPUArray对象。)

编译一个GPU MEX-File

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

mexcudamexGPUExample.cu

如果CUDA工具包没有发现或不受支持的版本,MATLAB编译使用NVIDIA的CUDA代码金宝app学校网站用MATLAB编译器安装。检查该编译器mexcuda使用,使用- v国旗的详细输出mexcuda命令。

MATLAB的CUDA工具包安装不包含所有可用库CUDA工具包。如果你想联系一个特定的库,与MATLAB没有安装,安装CUDA工具包。你可以检查CUDA工具包MATLAB版本需要使用gpuDevice。关于CUDA工具包的更多信息,请参阅CUDA工具包

如果mexcuda问题定位了NVIDIA编译器(学校网站)在你安装CUDA工具包,它可能被安装在一个非缺省位置。您可以指定的位置学校网站将其存储在您的系统的环境变量MW_NVCC_PATH。你可以设置这个变量使用MATLABsetenv命令。例如,

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

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

另请参阅

||

相关的话题