Есть несколько методов 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
, которые ведут себя таким образом.