Объяснение требований от входных данных к вычислениям на GPU, имеющим сложные результаты - PullRequest
0 голосов
/ 31 октября 2018

Рассмотрим эту строку кода:

gpuArray(-1)^0.5;

Что приводит к:

ans =
   0.0000 + 1.0000i

Теперь рассмотрим следующую строку кода:

gpuArray(-1).^0.5;

Что приводит к:

Error using  .^ 
POWER: needs to return a complex result, but this is not supported for real input X and Y on 
the GPU. Use POWER(COMPLEX(X), COMPLEX(Y,0)) instead. 

Проблема явно связана с преобразованием double -> complex double на графическом процессоре, что недопустимо. Действительно, когда я применяю обходной путь (который также упоминается в документах ), это решает проблему - но я не понимаю почему.

Кто-нибудь может пролить свет на это? Это какое-то ограничение VRAM? Из конкретной карты, которую я использую (у меня GTX 660 с CC 3.0)? Из реализации MATLAB (я использую R2018b)? ОС?

1 Ответ

0 голосов
/ 01 ноября 2018

Есть несколько методов gpuArray, которые ведут себя таким образом, и причина проста: производительность.

Вполне возможно написать реализацию напр. sqrt, который ведет себя на GPU так же, как работает реализация CPU в MATLAB (то есть вычисляет реальный результат, если не требуется сложный результат - в этом случае возвращает сложный результат). Часть работы уже выполнена - иначе метод gpuArray не будет знать, когда выдать ошибку. Однако дорогая часть затем перераспределяет (сложный) выход и выполняет операцию снова.

Существуют и другие небольшие заметные причуды, связанные с gpuArray и комплексными числами - на графическом процессоре все нулевые мнимые части не удаляются, когда реализация ЦП MATLAB удаляет их. Например:

>> a = [1i, 2]; gA = gpuArray(a);
>> [isreal(a(2)), isreal(gA(2))]
ans =
  1×2 logical array
   1   0

(Помня, конечно, что функция isreal в MATLAB сообщает вам о хранилище , а не значениях ).

РЕДАКТИРОВАТЬ: Только что понял, что есть ссылка на специальный документ для функций gpuArray, которые ведут себя таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...