CUDA - memcpy2d - tom errado
Acabei de iniciar a programação CUDA e estava tentando executar o código mostrado abaixo. A idéia é copiar uma matriz bidimensional para o dispositivo, calcular a soma de todos os elementos e recuperar a soma posteriormente (eu sei que esse algoritmo não é paralelo. Na verdade, ele está fazendo mais trabalho, então necessário. prática para memcopy).
#include<stdio.h>
#include<cuda.h>
#include <iostream>
#include <cutil_inline.h>
#define height 50
#define width 50
using namespace std;
// Device code
__global__ void kernel(float* devPtr, int pitch,int* sum)
{
int tempsum = 0;
for (int r = 0; r < height; ++r) {
int* row = (int*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
int element = row[c];
tempsum = tempsum + element;
}
}
*sum = tempsum;
}
//Host Code
int main()
{
int testarray[2][8] = {{4,4,4,4,4,4,4,4},{4,4,4,4,4,4,4,4}};
int* sum =0;
int* sumhost = 0;
sumhost = (int*)malloc(sizeof(int));
cout << *sumhost << endl;
float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(int), height);
cudaMemcpy2D(devPtr,pitch,testarray,0,8* sizeof(int),4,cudaMemcpyHostToDevice);
cudaMalloc((void**)&sum, sizeof(int));
kernel<<<1, 4>>>(devPtr, pitch, sum);
cutilCheckMsg("kernel launch failure");
cudaMemcpy(sumhost, sum, sizeof(int), cudaMemcpyDeviceToHost);
cout << *sumhost << endl;
return 0;
}
Este código compila perfeitamente (no candidato à versão 4.0 sdk). No entanto, assim que tento executar, recebo
0
cpexample.cu(43) : cutilCheckMsg() CUTIL CUDA error : kernel launch failure : invalid pitch argument.
O que é lamentável, já que não tenho idéia de como corrigi-lo ;-(. Até onde eu sei, o tom é um deslocamento na memória para permitir uma cópia mais rápida dos dados. No entanto, esse tom é usado apenas na memória do dispositivo, não está na memória do host, não é? Portanto, o tom da memória do host deve ser 0, não deveria?
lém disso, também gostaria de fazer duas outras perguntas:
Se eu declarar uma variável como int * sumhost (veja acima), para onde esse ponteiro aponta? Inicialmente na memória do host e depois do cudaMalloc na memória do dispositivo? @cutilCheckMsg foi muito útil nesse caso. Existem funções semelhantes para depuração que eu deveria conhecer?