Я пытаюсь выполнить кумулятивную сумму, используя функцию cumsum MATLAB на 22000x22000 gpuArray, заполненную -1 с, 0 с и 1 с. Я использую NVIDIA GeForce GTX 780 Ti, который имеет 3 ГБ памяти. GpuArray с двойной точностью слишком большой (3,9 ГБ), но, естественно, единственная точность подходит.«Из памяти на устройстве» с cumsum на gpuArray
Попытка сделать cumsum на моей единственной точности gpuArray снова привела к достижению предела моей памяти, но я не уверен, связано ли это с типами памяти или с подходом к вычислению cumsum, поскольку это p-файл MATLAB. Это также означает, что независимо от того, у меня мало контроля над типами данных, используемыми для расчета. Изменить: также cumsum не поддерживает целочисленные типы данных. Изменить: при дальнейшей проверке результат выполнения этого в уменьшенном массиве является одной, поэтому очень вероятная функция работает с массивом в качестве типа ввода.
Так что мой вопрос: есть ли альтернатива cumsum? (не петли - см. примечание). Может ли через MATLAB или CUDA разрешить спецификацию типа данных. Или может кто-нибудь изложить, как можно нарисовать (matricise?) Операцию cumsum, чтобы я мог написать ее сам?
EDIT: Альтернатива должна быть способна работать на целочисленных типах, так как только создание матрицы CUM превысит ограничение памяти. 2xsingle = double ...
ПРИМЕЧАНИЕ: Учитывая, что я буду выполнять это вычисление значительным количеством раз (без ограничений, представленным в документе), я бы в идеале имел увеличение скорости> 200x cumsum (gpuArray) против cumsum (double) , И даже не упоминайте петли, смехотворно медленно.
tic;CUM = cumsum(W,2);toc
Elapsed time is 0.002180 seconds.
K = gather(W);
tic;CUM = cumsum(K,2);toc
Elapsed time is 0.125203 seconds.
У вас есть код для публикации? Похоже, ваш вопрос был отправлен с отсутствующей информацией. – JoelC
Извинения JoelC, это мой первый пост, и я случайно попал в игру! Редактировать содержит остальную часть вопроса и код с таймингами. – br3ttles
Приходит на ум: вы можете попробовать int16 вместо одиночного, вы можете разделить свой массив на, скажем, 4 куска, каждый из которых достаточно мал, чтобы позволить вычисление (это несколько уменьшает скорость, но по крайней мере оно работает) – Jonas