复制内存CUDA中的非法内存访问

问题描述 投票:0回答:1

我正在尝试使用'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编程的新手,试图找出问题所在。我的代码中是否存在任何逻辑错误?

cuda gpu
1个回答
0
投票

正如Robert Crovella指出的那样,存在运行时错误。是的,发生在partition()方法中。返回(low+hi)/2,而不是运行partition()的整个算法。代码成功运行。在控制台上没有打印错误。

一旦找出分区代码中的逻辑错误,我将更新答案。

© www.soinside.com 2019 - 2024. All rights reserved.