2017-01-15 118 views
0

我对CUDA编程相对较新,因此存在一些未解决的问题,希望能够在正确的方向上获得一些提示。矩阵乘法矩阵及其在CUDA中的转置

所以情况是,我想乘的2D阵列具有它的转置和要精确我要执行的操作的Ť A.

我已经使用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; 
+4

如果你有正确的A(T)* A运行,并且你想提取上三角矩阵,为什么不显示你已经执行A(T)* A乘法的代码? –

+3

这个问题并没有比你上次提出的要好 – talonmies

+0

这是我第一次在堆栈上提出问题,所以我不太清楚你在说什么 – CloudTemper

回答

1

您可能需要使用批处理DGEMM API函数来描述here recursely将您的输出矩阵块对角和角内核的代码。您还需要在计算中平衡最小块大小与开销,以避免小调用。最后,请注意,矩阵乘法会在某个阶段使内存绑定,这在现代GPU上可能有点大。