C++ 处理大输入时出现CUDA错误

C++ 处理大输入时出现CUDA错误,c++,c,cuda,parallel-processing,nvidia,C++,C,Cuda,Parallel Processing,Nvidia,所以我有一个非常奇怪的错误正在发生。我有一个内核,它应该改变数组中每个元素的值。到目前为止,我只测试启动一个线程 __global__ void kernel(int* data) { for (int var = 0; var < SIZE; ++var) { data[var] = data[var] + 1; } } 谁能给我指一下正确的方向吗。为什么会出现这个问题?先谢谢你 编辑:是的。。这是尺寸定义。我现在

所以我有一个非常奇怪的错误正在发生。我有一个内核,它应该改变数组中每个元素的值。到目前为止,我只测试启动一个线程

    __global__ void kernel(int* data) {
        for (int var = 0; var < SIZE; ++var) {
            data[var] = data[var] + 1;
        }
    }
谁能给我指一下正确的方向吗。为什么会出现这个问题?先谢谢你


编辑:是的。。这是尺寸定义。我现在更改了代码,因此内核中硬编码的循环值与定义的常量之间没有差异。然而,如果我有10485760而不是1048576,它根本不起作用。。这是为什么。这不是一次性分配太多。。我的卡是Quadro FX 770m,计算能力为1.1。。下面是实际发生的事情。正如你们中的一些人所建议的,内核确实花费了太长的时间并且超时(尽管我从各种介绍中读到,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();
内核(data_d,0,1048576);
cudaDeviceSynchronize();
内核(data_d,10485762097152);
cudaDeviceSynchronize();
内核(data_d,20971523145728);
cudaDeviceSynchronize();
内核(data_d,31457284194304);
cudaDeviceSynchronize();
内核(data_d,4194304,5242880);
cudaDeviceSynchronize();
内核(data_d,5242880,6291456);
cudaDeviceSynchronize();
内核(data_d,6291456,7340032);
cudaDeviceSynchronize();
内核(data_d,7340032,8388608);
cudaDeviceSynchronize();
现在我想知道,怎样才能避免达到这个门槛。我试着加上

    Section "Device"
        Identifier     "Device0"
        Driver         "nvidia"
        VendorName     "NVIDIA Corporation"
        Option         "Interactive" "0"  #<<--- added to avoid kernel time-out
    EndSection
部分“设备”
标识符“设备0”
驱动程序“nvidia”
VendorName“NVIDIA公司”

选项“交互式”0#哪一行是89?为什么不对所有API调用和内核启动进行错误检查呢。如果不知道错误在代码中的何处出现,就很难给出答案……我真的很抱歉。说到CUDA,我真是个笨蛋。错误行实际上不在发布的soruce代码中。。该行将结果复制回主机:CUDA_CHECK_RETURN(cudaMemcpy(data,data_d,sizeof(int)*SIZE,cudaMemcpyDeviceToHost));话虽如此。。问题可能是我没有与cudaThreadSynchronize()同步;在我启动内核之后,在我尝试复制数据之前?我已经更新了我的代码,以便更好地反映正在发生的事情。内核呢?1048576真的是循环中的硬编码,还是实际上是
SIZE
?如果你想让我们确切地告诉你出了什么问题,你必须向我们展示准确的代码。否则我们怎么可能说问题出在哪里呢?(几乎可以肯定的是,它与您所认为的完全一样)因此,现在代码看起来应该在
SIZE=10485760
时正确工作,而在
SIZE=1048576
时则不正确,即与您所告诉我们的相反。我这么说是因为
SIZE=1048576
的情况应该是内核中保证的越界内存错误。可能有兴趣。我认为您希望将“Interactive”参数设置为“off”而不是“0”,但请检查驱动程序发行说明以确认正确的设置。您可以使用“常规”选项卡中的Nsight监视器更改windows上的超时。下一页解释了更多信息
        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