Думаю, проблема в том, что вы ошибаетесь в отношении указателей и указателей на указатели.
Вы, вероятно, должны сделать что-то вроде:
int *dev_pF;
size_t pitchF;
void init_cuda_mem(int mF,int mT,int nF,int nT) {
cudaMallocPitch((void **)&dev_pF, &pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
cudaMemcpy2D((void *)dev_pF,pitchF,(void *)pF, pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
}
Обратите внимание на то, что вы теперь берете адрес переменных в вызове cudaMallocPitch, а затем просто используете их непосредственно во втором вызове.
В исходном коде вы сначала просили cudaMalloc сохранить указатель в той памяти, на которую указывает dec_pF, и сохранить размер в той памяти, на которую указывал pitchF. И то, и другое объединено, поэтому там может произойти катастрофа. Во втором вызове вы конвертировали dev_pF из указателя в указатель на обычный указатель, поэтому вы говорите memcpy копировать память, начиная с того места, где хранился указатель, а не с того места, где была выделена память. И поскольку указатель на указатель и размер вначале унифицированы, может произойти практически все.
Кроме того, вы используете указатель pF, которого я не вижу в исходном коде, убедитесь, что он правильно инициализирован.