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

Cuda 如何使用推力减少外部产品,cuda,thrust,Cuda,Thrust,我有一个二维数组,$a,$存储在设备_向量中,索引(p,I)为N和m 我想计算 $$s_{ij} = \sum \limits_{p=1}^{N} a_{p,i} a_{p,j}$$ for $i,j=1,...,m.$ 有没有一种简单的方法可以使用推力来实现这一点 上面的代码是latex。在C++中,它会像 Matrix A(N,m); // filled with data Matrix S(m,m); for (int i=0; i <m;++i) for (int j

我有一个二维数组,$a,$存储在设备_向量中,索引(p,I)为N和m

我想计算

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

for $i,j=1,...,m.$ 
有没有一种简单的方法可以使用推力来实现这一点

上面的代码是latex。在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);

   }
矩阵A(N,m);//充满数据 矩阵S(m,m);
对于(inti=0;i如果我没有错过什么,那么

$$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中)

你想要什么?我无法很好地理解这些符号。o.o看看Q,我觉得我刚通过了IQ测试。你能提供串行代码吗?我认为没有一种简单的方法可以实现外部产品或Kronecker产品。我认为没有一种好的方法可以做到这一点。你可以做一些像g这样的事情使用一些奇特的迭代器表达式生成产品M X N,然后可能会以某种方式调用
reduce\u by\u key
。性能将不会令人印象深刻,因为它不会捕获外部两个嵌套for循环中的重用。将多个特别的N体CUDA内核中的一个用于此问题将更为直接。是的,一个可以这样做,但我主要担心的是,我需要两份矩阵的副本。