0

私はAxBCUDA で特別な行列 - 行列乗算 ( ) に取り組んでいます。ここAで、 はランダムMxM行列で、BMxN行列です。次のコードでは、Mは単なるですが、実際には、 の行列2000以上のものを与えるために大きな数に置き換えられます。実際には、 のすべての要素はランダムで、ある範囲に制限されるため、ランダム化関数によって生成されます。2GBAA

以下のコードでは、 の各要素がA配列からランダムにランダムに取得されるため、元の要素AxBは長さのベクトルとして でM乗算されBます。これが私のコードの書き方ですが、うまくいかないようです

#include <iostream>
#include <cusp/complex.h>

using namespace std;

#define M 2000
#define N 300

typedef cusp::complex<double> Complex;

__global__ void MVult(Complex* ad, Complex* bd, Complex* cd, int m1, int n1, int n2) 
{
  int x = (blockIdx.x * blockDim.x) + threadIdx.x;
  int y = (blockIdx.y * blockDim.y) + threadIdx.y;

  if(x < n2 && y < m1) 
  {   
    Complex sum = Complex(0.0, 0.0);
    int ridx = (rand()%(M-1)); // here I randomize the starting ridx 
    for(int i=0; i<n1; i++) sum += ad[ridx + i] * bd[i * n2 + x];
    cd[y * n2 + x] = v;
  }
}

int main(int argc, char *argv[])
{
  std::vector< Complex > _A(2*M+1);
  std::vector< Complex > _B(M*N);
  Complex *A, *B, *C;

  cudaMalloc((void**)&A, (2*M+1)*sizeof(Complex));
  cudaMalloc((void**)&B, M*N*sizeof(Complex));
  cudaMalloc((void**)&C, M*N*sizeof(Complex));

  for (int i=0; i<2*M+1; i++) _A[i] = Complex((double)i, (double)i);
  for (int i=0; i<M*N; i++) _B[i] = Complex(1.0, 0.0);

  cudaMemcpy( A, &_A[0], (2*M+1)*sizeof(Complex), cudaMemcpyHostToDevice );
  cudaMemcpy( B, &_B[0], (M*N)*sizeof(Complex), cudaMemcpyHostToDevice );

  dim3 block(32, 32);           
  dim3 grid((N+31)/32, (M+31)/32);

  MVult<<<grid, block>>>(A, B, C, M, M, N);
  cudaMemcpy(&_B[0], &C[0], (M*N)*sizeof(Complex), cudaMemcpyDeviceToHost);

  cudaFree(A);
  cudaFree(B);
  cudaFree(C);

  return 0;
}

CPU ループを使用してループを繰り返しM、そのたびにベクトルと行列の乗算 (CUDA で実行) を実行しようとしましたが、遅すぎます。問題をより迅速に解決する方法を探しています。

4

1 に答える 1