c++ - 结果 vector 错误

标签 c++ cuda

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

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;
}

感谢帮助

最佳答案

这是因为 MAT 的大小比它应该的大得多。基本上你需要 N == X,这应该不是问题,因为两者在编译时都是已知的。二维数组的内存布局在一个连续的 block 中,C 的主要行 - 因此在您的情况下,第一行对应于前 400 (sizeof(int)*N) 字节,第二行到第二个 400,等等。行的长度称为“步幅”。但是,cudaMemcpy 不知道步幅是多少,也不知道 MAT 的哪些元素具有填充后,它只是将前 nBytes 个字节从 MAT 复制到 MAT_DEV 中。由于 nBytessizeof(int)*X*X 并且 X == 7 <<N 第二个和矩阵的后续行永远不会被复制。仅复制 MAT 的前 196 个字节,这解释了为什么您的第二行全为零。

关于c++ - 结果 vector 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12273598/

相关文章:

C++ 链接问题,好像我不能链接到标准 C++ 东西

parallel-processing - CUDA __syncthreads() 在 warp 中的使用

cudaMallocManaged() 返回 "operation not supported"

c++ - Visual Studio 2010 链接器中的可能错误(包括最小测试用例)

c++ - Qt中如何通过QThread管理主窗口

c++ - 非类型模板参数、构造函数和推导指南

c++ - Opengl 中的视差法线贴图问题,GLSL

下三角矩阵上的 CUDA 循环

c++ - crt1.o : In function `_start' : (.text+0x20): undefined reference to `main'

matlab - 在带有 GPU 加速的 arrayfun 中使用匿名函数 (Matlab)