【问题标题】:Matrix Multiplication of matrix and its transpose in CudaCuda中矩阵的矩阵乘法及其转置
【发布时间】:2017-05-30 16:34:08
【问题描述】:

我对 CUDA 编程比较陌生,所以有一些未解决的问题希望我能在正确的方向上得到一些提示。

所以情况是我想将一个二维数组与其转置相乘,确切地说我想执行操作 ATA.

我已经使用了 cublas Dgemm 函数,现在我正在尝试使用平铺算法执行相同的操作,这与 CUDA 指南中的非常相似。

情况是,虽然初始算法运行正常,但我只想计算产品的上三角矩阵,希望能获得更好的操作时间,我不确定如何提取图块/块这将具有各自的元素。

因此,如果您能就此启发我,或提供任何提示,我将不胜感激,因为我已经坚持了一段时间。

这是内核的代码

__shared__ double Ads1[TILE_WIDTH][TILE_WIDTH];
__shared__ double Ads2[TILE_WIDTH][TILE_WIDTH];

//block row and column
//we save in registers for faster access
int by = blockIdx.y;
int bx = blockIdx.x;

int ty = threadIdx.y;
int tx = threadIdx.x;

int row = by * TILE_WIDTH + ty;
int col = bx * TILE_WIDTH + tx;

double Rvalue = 0;

if(row >= width || col >= width) return;
//Each thread block computes one sub-matrix Rsub of result R

for (int i=0; i<(int) ceil(((double) height/TILE_WIDTH)); ++i)
{
    Ads1[tx][ty] = Ad[(i * TILE_WIDTH + ty)*width + col];
    Ads2[tx][ty] = Ad[(i * TILE_WIDTH + tx)*width + row];
    __syncthreads();

    for (int j = 0; j < TILE_WIDTH; ++j)
    {   
        if ((i*TILE_WIDTH + j) > height ) break; //in order not to exceed the matrix's height

        Rvalue+=Ads1[j][tx]*Ads2[ty][j];
    }   
    __syncthreads();
}   
Rd [row * width + col] = Rvalue;

【问题讨论】:

  • 如果你的 A(T)*A 运行正确,并且你想提取上三角矩阵,为什么不显示你已经拥有的代码来执行 A(T)*乘法?
  • 这个问题并不比你上次问的好多少
  • 嗯,这是我第一次在堆栈上提出问题,所以我不太清楚你在说什么

标签: cuda


【解决方案1】:

您可能希望使用here 中描述的批处理 dgemm API 函数将输出矩阵与块对角线和角点进行递归划分。您还希望平衡最小块大小与计算开销,以避免小调用。最后,请注意矩阵乘法在某些阶段会限制内存,这在现代 GPU 上可能会有点大。

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 2020-05-11
    • 2012-05-06
    • 2011-05-02
    • 2011-04-21
    • 2011-09-07
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多