0

私の問題は、乗算を行うと、行列の最初の行をベクトルの最初の要素で乗算するだけで、次の要素がそれらをゼロにするため、結果のベクトルが間違った結果をもたらすことです。

using namespace std;
#define N 100
#define F 3
#define X 7
__global__ void matvec(int *MAT, int *VEC, int *SOL) {
  int bx = blockIdx.x;
  int tx = threadIdx.x;
  int i = 32*bx+tx;
  for (int j = 0; j < X; j++) {
    SOL[i] = ((MAT[i * X + j] * VEC[j]) +SOL[i]) % 2;
  }
}
int main () {
int i, j;
int MAT[N][N], VEC[N], SOL[N];
int *MAT_dev, *VEC_dev, *SOL_dev;
size_t nBytes = X * X * sizeof(int);

cout << "\t- - - - - MATRIX - - - - -\n\n";
for (i = 0; i < X; i++) {
  for (j = 0; j < X; j++) {
      cout << "Element [" << i << "][" << j << "]: ";
      cin >> MAT[i][j];
  }
 }
cout << endl << endl;
for (i = 0; i < X; i++) {
  for (j = 0; j < X; j++) {
    cout << MAT[i][j] << " ";
    if (j == (X - 1))
        cout << endl;
  }
 }
cout << endl << endl;
cout << "\t- - - - - VECTOR - - - - -\n\n";
for (i = 0; i < X; i++) {
  cout << "Element [" << i << "]: ";
  cin >> VEC[i];
}
cout << endl << endl;
for (i = 0; i < X; i++) {
  cout << VEC[i] << " ";
}
cout << endl << endl;

cudaMalloc((void**)&MAT_dev, nBytes);
cudaMalloc((void**)&VEC_dev, nBytes);
cudaMalloc((void**)&SOL_dev, nBytes);

cudaMemcpy(MAT_dev, MAT, nBytes, cudaMemcpyHostToDevice);
cudaMemcpy(VEC_dev, VEC, nBytes, cudaMemcpyHostToDevice);

dim3 dimBlock(X,X);
dim3 dimGrid(1,1);

matvec<<<dimGrid,dimBlock>>>(MAT_dev, VEC_dev, SOL_dev);

cudaMemcpy(SOL, SOL_dev, nBytes, cudaMemcpyDeviceToHost);

cout << "\t- - - - - RESULT - - - - -\n\n";
for (i = 0; i < X; i++)
{
  cout << SOL[i] << " ";
}
cout << endl << endl;

cudaFree(MAT_dev);
cudaFree(VEC_dev);
cudaFree(SOL_dev);

system("PAUSE");
return 0;
}

助けてくれてありがとう

4

1 に答える 1

1

これは、のサイズMATが本来よりもはるかに大きいためです。基本的にはが必要ですがN == X、どちらもコンパイル時にわかっているため、問題にはなりません。2D配列のメモリは、Cのメジャー行である単一の連続したブロックに配置されます。したがって、この場合、最初の行は最初の400(sizeof(int)*N)バイトに対応し、2番目の行は2番目の400バイトに対応します。行は「ストライド」と呼ばれます。ただし、cudaMemcpyストライドが何であるか、またはのどの要素が入力されているかはわかりません。最初のバイトをからにMATコピーするだけです。is and == 7 <<なので、行列の2行目以降はコピーされません。から最初の196バイトのみnBytesMATMAT_DEVnBytessizeof(int)*X*XXNMATコピーされ、2番目の行がすべてゼロである理由を説明します。

于 2012-09-05T03:30:35.187 に答える