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?

questionAnswers(1)

yourAnswerToTheQuestion