Написал программу, использующую C ++ AMP для запуска на графическом процессоре моего ноутбука (Intel HD Graphics 520). Ядро GPU длинное, поэтому я дам описание высокого уровня (но дайте мне знать, если потребуется больше).
Обратите внимание, что я попадаю в категорию программистов "достаточно осведомлен, чтобы быть опасным".
parallel_for_each(accelerator_view, number_of_runs.extent, [data](index<1> idx) restrict(amp)
{
double total = data.starting_total[idx];
//these "working variables" are used for a variety of things in the code
double working_variable = 0.0;
double working_variable2 = 0.0;
for (int i = 0; i < 20; i++)
{
...do lots of stuff. "total" is changed by various factors...
//total is still a positive number that is greater than zero
//working_variable now has a positive non-zero value, and I want to find what %
//of the remaining total that value is
working_variable2 = 1.0 / total;
working_variable2 = working_variable * working_variable2;
//Note that if I write it like this the same issue will happen:
working_variable2 = working_variable / total;
...keep going and doing more things, write some values to data..
if (total == 0)
break;
}
}
Когда я запускаю это, ничего не делая на своем компьютере, все работает нормально, и я получаю ожидаемые результаты.
То, что становится действительно сложным, - это когда я подчеркиваю систему (или я думаю, что я подчеркиваю систему). Я проверяю стресс системы
1) Старт моей программы
2) Открытие Chrome
3) Переход на Youtube и запуск видео
Когда я это делаю, я получаю неожиданные результаты (когда я открываю программу или запускаю видео). Я проследил это до вычисления «1.0 / total», возвращающего бесконечность (inf), даже если «total» больше нуля. Вот пример того, что я выводил на консоль, когда эта проблема возникает:
total = 51805.6
1.0 / total = inf
precise_math::pow(total, -1) = 1.93029e-05
Я запускаю ядро около 1,6 миллиона раз, и я увижу от 0 до 15 из этих 1,6 миллионов, затронутых этой проблемой. Количество проблем варьируется, и какие темы затрагивают проблему.
Так что я уверен, что «итого» - это не ноль, и это не ситуация деления на ноль. Что мне не хватает? Что может быть причиной этой проблемы? Есть ли способ предотвратить это? Я думаю о замене всего деления в ядре на pow (num, -1)
P.S. Да, я знаю, что часть ответа «не смотрите видео во время работы». Больше всего меня беспокоит открытие программ во время выполнения.
Спасибо!