0

そのため、かなり奇妙なエラーが発生しています。配列内のすべての要素の値を変更するはずのカーネルがあります。現時点では、1 つのスレッドを起動してテストするだけです。

    __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

誰かが私を正しい方向に向けることができますか?なぜこの問題が起こっているのですか? 前もって感謝します

編集:そうです..それはサイズの定義です。カーネル内のハードコードされたループ値と定義された定数との間に矛盾がないように、コードを変更しました。ただし、1048576 の代わりに 10485760 を使用すると、単に機能しません。なぜでしょうか。これは、一度に割り当てる量が多すぎるということではありません。私のカードは、計算能力 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 に答える