如何使用推力减少外部产品

时间:2012-11-30 00:13:23

标签: cuda thrust

我有一个二维数组,$ a,$存储在device_vector中,索引(p,i)的维数为N和m

我想要计算

$$s_{ij} = \sum \limits_{p=1}^{N} a_{p,i} a_{p,j}$$

for $i,j=1,...,m.$ 

使用推力有一种简单的方法吗?

以上代码是乳胶。在C ++中,它将类似于

Matrix A(N,m); // filled with data

Matrix S(m,m);

for (int i=0; i <m;++i)
  for (int j=0; j <m;++j) 
   { 
     S(i,j)=0;
     for (int p=0; p < N; ++p)
        S(i,j) += A(p,i)*A(p,j);

   }

1 个答案:

答案 0 :(得分:2)

如果我不遗漏某些东西,那么似乎

$$s_{ij} = \sum_{p=1}^{N} a_{p,i} a_{p,j} = \sum_{p=1}^{N} a^T_{i,p} a_{p,j}$$

因此

$$S = A^T A$$

通常的矩阵产品。我也不认为你可以用推力做到这一点。但是你可以使用CUBLAS或Arrayfire轻松地进行矩阵乘法(实际上我认为arrayfire在内部使用了cublas)。但请记住,这些库按列主要顺序存储矩阵(如在fortran中)