0

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

    __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 它根本不起作用.. 为什么会这样。这不是一次太多的分配。我的卡是计算能力 1.1 的 Quadro FX 770m

4

1 回答 1

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 中的设备部分,但这并没有真正帮助。

于 2013-06-06T22:31:21.243 回答