Se si esegue questo programma, viene visualizzato "un accesso errato alla memoria nell'errore matrixMulti.cu alla riga 48". Ho cercato e provato molto. Quindi spero che qualcuno possa aiutarmi.Il semplice test CUDA fallisce sempre con "un accesso illegale alla memoria rilevato" errore
Riga 48: HANDLE_ERROR (cudaMemcpy (array, devarray, N * N * sizeof (int), cudaMemcpyDeviceToHost));
Il programma è solo per entrare in CUDA. Ho provato ad implementare una moltiplicazione di matrice.
#include <iostream>
#include<cuda.h>
#include <stdio.h>
using namespace std;
#define HANDLE_ERROR(err) (HandleError(err, __FILE__, __LINE__))
void printVec(int** a, int n);
static void HandleError(cudaError_t err, const char *file, int line)
{
if (err != cudaSuccess)
{
printf("%s in %s at line %d\n", cudaGetErrorString(err),
file, line);
exit(EXIT_FAILURE);
}
}
void checkCUDAError(const char *msg)
{
cudaError_t err = cudaGetLastError();
if(cudaSuccess != err)
{
fprintf(stderr, "Cuda error: %s: %s.\n", msg,
cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
}
__global__ void MatrixMulti(int** a, int** b) {
b[0][0]=4;
}
int main() {
int N =10;
int** array, **devarray;
array = new int*[N];
for(int i = 0; i < N; i++) {
array[i] = new int[N];
}
HANDLE_ERROR (cudaMalloc((void**)&devarray, N*N*sizeof(int)));
HANDLE_ERROR (cudaMemcpy(devarray, array, N*N*sizeof(int), cudaMemcpyHostToDevice));
MatrixMulti<<<1,1>>>(array,devarray);
HANDLE_ERROR (cudaMemcpy(array, devarray, N*N*sizeof(int), cudaMemcpyDeviceToHost));
HANDLE_ERROR (cudaFree(devarray));
printVec(array,N);
return 0;
}
void printVec(int** a , int n) {
for(int i =0 ; i < n; i++) {
for (int j = 0; j <n; j++) {
cout<< a[i][j] <<" ";
}
cout<<" "<<endl;
}
}
Grazie :) Penso che proverò la versione 1D della matrice, sembra essere più facile – Henrik