Я только начал программировать на CUDA и пытался выполнить код, показанный ниже.Идея состоит в том, чтобы скопировать 2-мерный массив на устройство, вычислить сумму всех элементов и впоследствии извлечь сумму (я знаю, что этот алгоритм не распараллелен. На самом деле он выполняет больше работы, чем необходимо. Однако это просто предназначенокак практика для 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;
}
Этот код прекрасно компилируется (в версии-кандидате SDK 4.0).Однако, как только я пытаюсь выполнить, я получаю
0
cpexample.cu(43) : cutilCheckMsg() CUTIL CUDA error : kernel launch failure : invalid pitch argument.
, что вызывает сожаление, так как я понятия не имею, как это исправить ;-(. Насколько я знаю, высота тона - это смещение в памятичтобы обеспечить более быстрое копирование данных. Однако такой шаг используется только в памяти устройства, а не в памяти хоста, не так ли? Поэтому шаг моей памяти хоста должен быть 0, не так ли?
Кроме того, я также хотел бы задать еще два вопроса:
- Если я объявляю переменную типа int * sumhost (см. Выше), куда этот указатель указывает? Сначала на память хоста ипосле cudaMalloc в память устройства?
- cutilCheckMsg был очень удобен в этом случае. Существуют ли похожие функции для отладки, о которых я должен знать?