Монитор мигает и программа выдает исключение при использовании Alea

В 90% случаев, когда я запускаю свою программу на тех же самых тестовых данных, она вылетает.

Непосредственно перед тем, как он падает - монитор выключается и включается, как будто меняется разрешение.

введите описание изображения здесь

Потребление памяти на момент сбоя составляет около 340 Mb что гораздо меньше, чем доступная система 16 Gb и гораздо меньше, чем видеокарта доступна 1 Gb

Сразу после этого - я получаю либо CUDA_ERROR_LAUNCH_FAILED исключение:

введите описание изображения здесь

или же CUDA_ERRROR_UNKNOWN исключение:

введите описание изображения здесь

Тестовый код:

    static void Main(string[] args)
    {
        Console.WriteLine("Start");

        var gpu = Gpu.Default;

        int[] in1 = new int[1245456];
        int[] in2 = new int[1245456];
        double[] in3 = new double[100000];
        bool[][] in4 = new bool[100000][];
        for (int i = 0; i < in4.Length; i++)
        {
            in4[i] = new bool[2];
        }
        bool[] results = new bool[1245456];
        //bool[] results2 = gpu.Allocate<bool>(results.Length); // option 2. Same result. explicit memory allocation

        gpu.For(0, in1.Length, idx => Do2(idx, in1, in2, in3, in4, results)); // you can try change result with result2. Same "result".

        //results = Gpu.CopyToHost(results2);
        //Gpu.Free(results2);

        Console.WriteLine("End");
        Console.ReadKey();
    }

    public static void Do2(
        int idx,
        int[] in1,
        int[] in2,
        double[] in3,
        bool[][] in4,
        bool[] results)
    {
        bool isTrue = false;
        int varA = in1[idx];
        int varB = in2[idx];

        double calculatable = 0;

        for (int i = 0; i < in3.Length; i++)
        {
            if (isTrue)
            {
                if (in4[i][varA])
                    continue;

                calculatable = calculatable + in3[i] + 2;
                isTrue = false;
            }
            else
            {
                if (in4[i][varB])
                    continue;

                calculatable = calculatable + in3[i] -1;
                isTrue = true;
            }
        }

        if (calculatable >= 1) // if we comment out this line (NOT the whole block) - then all finished successfully
        {
            results[idx] = true; // doesn't matter if true or false
        }
    }

К сожалению, на данный момент - я не могу проверить решение с [GpuManaged] флаг, из-за 2 других проблем ( клик, клик), но я попытался вручную явно управлять памятью, что привело к тому же результату..

Кто-нибудь может подсказать, пожалуйста, что я делаю не так?

Это выглядит очень странно, потому что тот же код, но с закомментированной строкой if (calculatable >= 1) работает просто отлично, что наводит меня на мысль, что проблема не имеет ничего общего с памятью.

Ps если вы не можете воспроизвести проблему - попробуйте увеличить in3 а также in4 длина больше чем 100000, На меньших количествах это работает нормально на моем ПК, а также..

  • выиграть 10 x64, 8700k, 16 Гб оперативной памяти
  • Geforce GT 710 1GB
  • Alea 3.0.4
  • alea.fody 3.0.4
  • fsharp.core 4.3.4

0 ответов

Другие вопросы по тегам