C++ 结果向量上的错误

C++ 结果向量上的错误,c++,cuda,C++,Cuda,我的问题是,当我进行乘法时,它只将矩阵的第一行与向量的第一个元素相乘,而下一个元素使它们为零,因此结果向量给出了错误的结果 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 (

我的问题是,当我进行乘法时,它只将矩阵的第一行与向量的第一个元素相乘,而下一个元素使它们为零,因此结果向量给出了错误的结果

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;
}
使用名称空间std;
#定义N 100
#定义f3
#定义x7
__全局无效matvec(int*MAT,int*VEC,int*SOL){
int bx=blockIdx.x;
int tx=线程idx.x;
int i=32*bx+tx;
对于(int j=0;jcout这是因为
MAT
的大小比它应该的大得多。基本上,您需要
N==X
,这不应该是一个问题,因为在编译时两者都是已知的。2D数组的内存放在一个连续的块中,C的行是主要的——因此在您的例子中,第一行对应于前400行(
sizeof(int)*N
)字节,第二行到第二个400字节,等等。行的长度称为“跨步”。然而,
cudaMemcpy
不知道跨步是什么,也不知道填充了
MAT
的哪些元素,它只是将
MAT
中的第一个
nBytes
字节复制到
MAT DEV
中。因为
nBytes
sizeof(整数)*X*X
X
==7你的问题是什么?你只是解释说你写了代码,但你不喜欢它的功能。感谢Matt Phillips,这真的很有帮助。我只把我的N数改为相同的X数,然后就开始工作了。解释第二行时,可能有点困惑,我的意思是,结果的第一个值向量是ok的其余值(接下来的6个值)是那些返回零的。用你的答案购买它确实复制了其余的行并进行了乘法运算。@Scabro93很高兴它成功了。但是你输出向量中的零非常有意义——导入CUDA的矩阵,由于我刚才提到的原因,都是从第二行开始的零。所以用向量进行乘法运算,结果是它在一个非零的第一个元素中,其余的元素为零。