Ошибка в результирующем векторе

Моя проблема в том, что когда я делаю умножение, он только умножает первую строку матрицы на первый элемент вектора, а следующие элементы обнуляют их, поэтому вектор результата дает неверный результат.

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

Спасибо за помощь

0

Решение

Это потому что размер MAT гораздо больше, чем должно быть. В основном вам нужно N == X, что не должно быть проблемой, потому что оба известны во время компиляции. Память для двумерного массива расположена в одном смежном блоке, основной ряд для C — поэтому в вашем случае первый ряд соответствует первым 400 (sizeof(int)*Nбайт, второй ряд до второго 400 и т. д. Длина строки называется «шагом». Однако cudaMemcpy понятия не имеет, что такое шаг или какие элементы MAT были заполнены, он просто копирует первый nBytes байты из MAT в MAT_DEV, поскольку nBytes является sizeof(int)*X*X а также X == 7 << N вторая и последующие строки вашей матрицы никогда не копируются. Только первые 196 байтов из MAT получить копию, объясняя, почему ваш второй ряд все нули.

1

Другие решения

Других решений пока нет …