2

当我在循环中运行我的内核函数 600 多次(如果它像 50 次左右它不会崩溃)时,我的计算机崩溃(我必须手动重置它),我不确定是什么导致了崩溃。

我的主要是这样的:

int main()
{
    int *seam = new int [image->height];
    int width = image->width;
    int height = image->height;

    int *fMC = (int*)malloc(width*height*sizeof(int*));
    int *fNew = (int*)malloc(width*height*sizeof(int*));

    for(int i=0;i<numOfSeams;i++) 
    {
        seam = cpufindSeamV2(fMC,width,height,1);

        fMC = kernel_shiftSeam(fMC,fNew,seam,width,height,nWidth,1);

        for(int k=0;k<height;k++)
        {
            fMC[(nWidth-1)+width*k] = INT_MAX;
        }
    }

我的内核是:

int* kernel_shiftSeam(int *MCEnergyMat, int *newE, int *seam, int width, int height, int x, int direction)
{
    //time measurement
    float elapsed_time_ms = 0;
    cudaEvent_t start, stop;      //threads per block

    dim3 threads(16,16);
    //blocks
    dim3 blocks((width+threads.x-1)/threads.x, (height+threads.y-1)/threads.y);

    //MCEnergy and Seam arrays on device
    int *device_MC, *device_new, *device_Seam;

    //MCEnergy and Seam arrays on host
    int *host_MC, *host_new, *host_Seam;


    //total number of bytes in array
    int size = width*height*sizeof(int);
    int seamSize;



    if(direction == 1)
    {
        seamSize = height*sizeof(int);
        host_Seam = (int*)malloc(seamSize);
        for(int i=0;i<height;i++)
            host_Seam[i] = seam[i];
    }
    else
    {
        seamSize = width*sizeof(int);
        host_Seam = (int*)malloc(seamSize);
        for(int i=0;i<width;i++)
            host_Seam[i] = seam[i];
    }

     cudaMallocHost((void**)&host_MC, size );
     cudaMallocHost((void**)&host_new, size );

     host_MC = MCEnergyMat;
     host_new = newE;

    //allocate 1D flat array on device
    cudaMalloc((void**)&device_MC, size);
    cudaMalloc((void**)&device_new, size);
    cudaMalloc((void**)&device_Seam, seamSize);

    //copy host array to device
    cudaMemcpy(device_MC, host_MC, size, cudaMemcpyHostToDevice);
    cudaMemcpy(device_new, host_new, size, cudaMemcpyHostToDevice);
    cudaMemcpy(device_Seam, host_Seam, seamSize, cudaMemcpyHostToDevice);

    //measure start time for cpu calculations
    cudaEventCreate(&start);
    cudaEventCreate(&stop);
    cudaEventRecord(start, 0);



    //perform gpu calculations
    if(direction == 1)
    {
      gpu_shiftSeam<<< blocks,threads >>>(device_MC, device_new, device_Seam, width, height, x);
    }

    //measure end time for cpu calcuations
    cudaEventRecord(stop, 0);
    cudaEventSynchronize(stop);
    cudaEventElapsedTime(&elapsed_time_ms, start, stop );

    execTime += elapsed_time_ms;

    //copy out the results back to host
    cudaMemcpy(newE, device_new, size, cudaMemcpyDeviceToHost);

    //free memory
    free(host_Seam);
    cudaFree(host_MC); cudaFree(host_new); 
    cudaFree(device_MC); cudaFree(device_new); cudaFree(device_Seam);

    //destroy event objects
    cudaEventDestroy(start); cudaEventDestroy(stop);

    return newE;
}

所以,当我多次调用“kernel_shiftSeam”时,我的程序崩溃了,我还使用 cudaFree 释放了内存,所以我不知道它是否是内存泄漏问题。如果有人能指出我正确的方向,那就太好了。

4

1 回答 1

1

可能是堆问题。尝试将内核中的 cudaFree 语句重新排序为 LIFO。检查包含堆/泄漏修复的任何更新的 CUDA 驱动程序的发行说明。在 Windows 上尝试安装进程资源管理器 15.12 或更高版本,因为它显示 GPU 内存使用情况 - 并且很容易发现泄漏堆。

于 2012-05-02T22:30:36.400 回答