处理大输入时出现CUDA错误

时间:2013-06-06 11:54:35

标签: c++ c cuda parallel-processing nvidia

所以我发生了一个相当奇怪的错误。我有一个内核应该改变数组中每个元素的值。截至目前,我只测试启动一个线程。

    __global__ void kernel(int* data) {
        for (int var = 0; var < SIZE; ++var) {
            data[var] = data[var] + 1;
        }
    }

以下是整个代码:

    #include "stdint.h"
    #include "stdio.h"
    #include "kernelLauncher.cuh"
    #include <cuda_runtime.h>

    #define  SIZE 10485760

    typedef uint64_t POLY_64;
    typedef unsigned char BYTE;


    __global__ void kernel(int* data) {

        for (int var = 0; var < SIZE; ++var) {
            data[var] = data[var] + 1;
        }

    }

    int main() {

        int* data = (int*) malloc(sizeof(int) * SIZE);
        int* data_d;

        for (int var = 0; var < SIZE; ++var) {
            data[var] = 1;
        }
        //allocate device memory for the fingerprinting data
        cudaMalloc((void**) &data_d, sizeof(int) * SIZE);

        //copy the data to device

        CUDA_CHECK_RETURN(
                cudaMemcpy(data_d, data, sizeof(int) * SIZE, cudaMemcpyHostToDevice));

        kernel<<<1, 1>>>(data_d);
        cudaThreadSynchronize();


        CUDA_CHECK_RETURN(cudaMemcpy(data, data_d, sizeof(int) * SIZE, cudaMemcpyDeviceToHost));

        //try to print the result
        for (int var = 0; var < SIZE; ++var) {
            printf("%d\n", data[var]);
        }

        CUDA_CHECK_RETURN(cudaFree(data_d));
        return 0;
    }

当我的SIZE定义为1048576时,我的数据恢复正常。不幸的是,当我将其定义为10485760(10倍以上)时。我明白了:

    Error unspecified launch failure at line 40 in file ../src/runTest.cu

有人能指出我正确的方向吗?为什么会出现这个问题?提前谢谢

编辑:是的..这是尺寸定义。我现在改变了我的代码,因此内核中的硬编码循环值与定义的常量之间没有差异。但是,如果我有10485760而不是1048576它根本不起作用..为什么会这样。这不是一次性分配..我的卡是Quadro FX 770m,计算能力为1.1

1 个答案:

答案 0 :(得分:0)

所以..这是实际上似乎正在发生的事情。正如你们中的一些人所说的那样,内核实际上耗时太长而且超时(尽管我从各种各样的内容中读到这不会发生在Linux系统上)所以将这样的工作分开实际上解决了这个问题并避免看门狗杀死内核:

        kernel<<<1, 1>>>(data_d, 0, 1048576);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 1048576, 2097152);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 2097152, 3145728);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 3145728, 4194304);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 4194304, 5242880);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 5242880, 6291456);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 6291456, 7340032);
        cudaDeviceSynchronize();
        kernel<<<1, 1>>>(data_d, 7340032, 8388608);
        cudaDeviceSynchronize();

现在我想知道,避免达到这个门槛的方法是什么。我尝试添加

    Section "Device"
        Identifier     "Device0"
        Driver         "nvidia"
        VendorName     "NVIDIA Corporation"
        Option         "Interactive" "0"  #<<--- added to avoid kernel time-out
    EndSection

进入我的Xorg.conf中的设备部分,但这并没有真正帮助。