我正在尝试使用'cudaMemcpy'将阵列从设备复制到主机。我在控制台illegal memory access was encountered in c:\users\some-pc\documents\visual studio 2015\projects\vc++cuda\vc++cuda\quicksort.h in line 68
上遇到错误。
下面是代码:
__device__ int partition(int *arr, int low, int hi) {
int i = low + 1;
int j = hi;
int pivot = arr[low];
while (low <= hi) {
while (arr[i] < pivot && i < hi) {
i++;
}
while (arr[j] > pivot) {
j--;
}
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++; j--;
}
else {
i++;
}
}
arr[low] = arr[j];
arr[j] = pivot;
return j;
}
__global__ void quicksortDevice(int *arr, int low, int hi) {
if (low >= hi) return;
int partitionIndex = partition(arr, low, hi);
printf("inside quicksortDevice");
cudaStream_t s;
cudaStreamCreateWithFlags(&s, cudaStreamNonBlocking);
// Below code is parellel
quicksortDevice<<<1,1, 0, s>>>(arr, low, partitionIndex-1);
// quicksortDevice(arr, partitionIndex + 1, hi);
}
// host code...
void quicksort(int *host_array, int size) {
int *device_array;
printVector(vector<int>(host_array, host_array + size));
HANDLE_ERROR(cudaMalloc((void **)&device_array, size * sizeof(float)));
HANDLE_ERROR(cudaMemcpy(device_array, host_array, size * sizeof(int), cudaMemcpyHostToDevice));
quicksortDevice <<<1, 1>>> (device_array, 0, size - 1);
int *sorted_array = (int *)malloc(size * sizeof(int));
HANDLE_ERROR(cudaMemcpy(sorted_array, device_array, size * sizeof(int), cudaMemcpyDeviceToHost)); // Illegal memory access error.
printVector(vector<int>(sorted_array, sorted_array+size));
}
我在将设备内存“ device-array”复制到“ sorted_array”甚至“ host_array”时出错。即功能“快速排序”的倒数第二条指令/代码。
我正在使用Visual Studio2015。Cuda10.2工具包。我是cuda编程的新手,试图找出问题所在。我的代码中是否存在任何逻辑错误?
正如Robert Crovella指出的那样,存在运行时错误。是的,发生在partition()方法中。返回(low+hi)/2
,而不是运行partition()的整个算法。代码成功运行。在控制台上没有打印错误。
一旦找出分区代码中的逻辑错误,我将更新答案。