Причудливость подразделения C ++ AMP при нагрузке на GPU - PullRequest
1 голос
/ 13 марта 2019

Написал программу, использующую 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. Да, я знаю, что часть ответа «не смотрите видео во время работы». Больше всего меня беспокоит открытие программ во время выполнения.

Спасибо!

...