使用Cublas在Alea GPU上使用矩阵乘法



我正在尝试将GEMM用于Alea GPU上的矩阵乘法,但是,此代码给出了错误的结果。

Gpu gpu = Gpu.Default;
Blas blas = new Blas(gpu);
int m=2,n=3;    //in dimension and out dimension (output will be mxn matrix)
int k=4;
//column major
float[,] A = new float[4,2] { {100,200},{2,6},{3,7},{4,8} };    //2x4 matrix
float[,] B = new float[3,4] { {1,4,7,10}, {2,5,8,11}, {3,6,9,12} }; //4x3 matrix
float[,] C = new float[3,2] { {-1,-1}, {-1,-1}, {-1,-1}  }; //2x3 matrix
var dA = gpu.AllocateDevice<float>(A);  
var dB = gpu.AllocateDevice<float>(B);  
var dC = gpu.AllocateDevice<float>(C);
blas.Gemm(Operation.N,Operation.N,m,n,k,1f,dA.Ptr,m,dB.Ptr,k,0f,dC.Ptr,m);
var result = Gpu.Copy2DToHost(dC);

这是我得到的结果。它只是从矩阵A中复制了一些数字。

100 -1 -1
200 -1 -1

代码有什么问题吗?请帮助。

我使用的是Alea 3.0.3与CUDA工具包8.0。

update1 :我发现,当我将A,B,C矩阵到1D阵列时,它给出了正确的结果。但是,仍然想知道2D阵列有什么问题。

我发现2D阵列的gpu.alocatedevice不会像在CPU上分配GPU上的空间。任何两个连续列的第一元素之间的距离(音高)都非常大。

因此,必须更改前导维度参数。

blas.Gemm(Operation.N,Operation.N,m,n,k,1f,dA.Ptr,dA.PitchInElements.ToInt32(),dB.Ptr,dB.PitchInElements.ToInt32(),0f,dC.Ptr,dC.PitchInElements.ToInt32());

现在,我得到了正确的结果。但是,是否有任何文件显示有关GPU上2D阵列分配的详细信息?

我只能看到http://www.aleagpu.com/release/3_0_3/api/html/6f0dc687-7191-7191-91ba-6c30-bb379ddded567.htm

最新更新