【问题标题】:matrix multiplication using cuBLAS on alea gpu在 alea gpu 上使用 cuBLAS 进行矩阵乘法
【发布时间】:2018-02-12 22:28:53
【问题描述】:

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

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 中复制一些数字。矩阵 C 中的一些数字在初始化时不会改变。

100 -1 -1
200 -1 -1

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

我正在使用 alea 3.0.3 和 cuda 工具包 8.0。

UPDATE1:我发现当我将 A、B、C 矩阵展平为一维数组时,它会给出正确的结果。不过,还是想知道二维数组有什么问题。

【问题讨论】:

    标签: matrix-multiplication cublas aleagpu


    【解决方案1】:

    我发现用于 2D-Array 的 gpu.AllocateDevice 不会像在 CPU 上那样在 GPU 上分配空间。任意 2 个连续列的第一个元素之间的距离(间距)大得惊人。

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

    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-array 分配如何在 Alea 中真正起作用?

    我只能看到没有解释的http://www.aleagpu.com/release/3_0_3/api/html/6f0dc687-7191-91ba-6c30-bb379dded567.htm

    【讨论】:

    • 很可能,它正在使用cudaMallocPitch。间距的原因是将矩阵行与物理内存通道对齐,以便在某些内核中获得更好的性能。
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2013-09-02
    • 2013-01-11
    • 2013-01-13
    • 1970-01-01
    • 2020-03-09
    • 2011-11-30
    • 2016-03-31
    相关资源
    最近更新 更多