Matlab调用c版gpu程序

matlab中声明parallel.gpu.CUDAKernel('add2.ptx','add2.cu','add2');
其中,add2.ptx由nvcc -ptx add2.cu生成。add2.cu为源程序,如果没有源程序,需要声明程序入口('add2.ptx','int * a,int * b','add2').add2为add2.cu中的函数。即为其中声明为__global__的函数。当输入参数中有数组时,数组的尺度是不会传入的。需要使用其他参数传入。
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
k1 = parallel.gpu.CUDAKernel('add2.ptx','add2.cu','add2');
%设置线程
k1.GridSize = [4,1,1];
k1.ThreadBlockSize = [1024,1,1];

N = 100;
a = int32(rand(N,1)*100);
b = int32(rand(N,1)*100);
ina = gpuArray(a);
inb = gpuArray(b);
%转换到gpu内存中


out1 = gpuArray(int32(rand(N,1)*100));

inN = gpuArray(N);
ores = feval(k1,ina,inb,inN,out1);
res = gather(ores);
out = gather(out1);
%转换回来
mlres = a+b;

sum(res-mlres)

此时的add2函数为:

1
2
3
4
5
6
7
8
9
__global__ void add2(const int * a ,const int * b, const int N, int * c)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
while(tid < N)
{
c[tid] = a[tid] + b[tid];
tid += blockDim.x * gridDim.x;
}
}

声明为const为输入量,只有非const为输出。但好像并没有什么鸟用,只是说明了输出的大小,如果输出跟输入某个一样大小,完全可以

1
2
3
4
5
6
7
8
9
__global__ void add2(const int * a ,const int * b, const int N, int * c)
{
int tid = threadIdx.x + blockIdx.x*blockDim.x;
while(tid < N)
{
a[tid] = a[tid] + b[tid];
tid += blockDim.x * gridDim.x;
}
}

然后使用ores = feval(k1,ina,inb,inN);调用。