运行包含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代码。选择时考虑以下几点与MEX-file方法CUDAKernel
方法:
mex files库问题吗?看看交换机可以与日志,如NVIDIA表现原语(NPP)或CUFFT库,也可以包含函数调用从主机在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长度相同。的函数mxGPUCopyReal
和mxGPUCopyImag
每一个真实或虚构的元素复制到一个新的真正的mxGPUArray。(没有的mxGetImagData
函数mxGPUArray对象。)
编译一个GPU MEX-File
要编译CUDA的代码必须安装了CUDA工具包版本一致ToolkitVersion
财产的gpuDevice
对象。
使用mexcuda
在MATLAB命令编译包含CUDA的MEX-file代码。您可以使用命令编译示例文件:
mexcudamexGPUExample.cu
如果mexcuda
问题定位了NVIDIA编译器(学校网站
),它可能被安装在一个非默认的位置。您可以指定的位置学校网站
将其存储在您的系统的环境变量MW_NVCC_PATH
。你可以设置这个变量使用MATLABsetenv
命令。例如,
setenv (“MW_NVCC_PATH”,“/ usr /地方/ CUDA / bin”)
只有一个子集的Visual Studio®编译器支持mexcuda。金宝app详情,请咨询英伟达工具包的文档。