2014-09-24 5 views
1

Я пытаюсь выполнить кумулятивную сумму, используя функцию 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. 
+0

У вас есть код для публикации? Похоже, ваш вопрос был отправлен с отсутствующей информацией. – JoelC

+0

Извинения JoelC, это мой первый пост, и я случайно попал в игру! Редактировать содержит остальную часть вопроса и код с таймингами. – br3ttles

+0

Приходит на ум: вы можете попробовать int16 вместо одиночного, вы можете разделить свой массив на, скажем, 4 куска, каждый из которых достаточно мал, чтобы позволить вычисление (это несколько уменьшает скорость, но по крайней мере оно работает) – Jonas

ответ

1

Если вы только собираетесь использовать значения -1, 0 и 1 в вашей матрице, вы можете уйти с использованием байт памяти с помощью подписанного 8-разрядного целого числа типа INT8, которая позволяет номера От -128 до 127. (Только с параметрами -1,0 и 1 вы можете технически подбирать четыре значения в один байт с 2 битами каждый, но вам может потребоваться только это, если у вас все еще не хватает памяти).

Так что, если вы хотите, чтобы инициализировать ваш массив с INT8, вы можете сделать это:

gpuArray = zeros(22000,22000,'int8'); 

Какой должна быть < 500MB в размерах.

+0

Спасибо @can_of_awe. К сожалению, это не подходит для моих целей: «Ошибка при использовании cumsum CUMSUM не поддерживается для целочисленного ввода» – br3ttles

0

просто замечание, отсчет времени, как ваш код, как это неправильно, при работе с gpuArray. Вы должны время это, как этот

tic;CUM = cumsum(W,2);wait(gpuDevice());toc 

В противном случае, MATLAB не сосчитать на самом деле вычисления, так как она не нужна для функции синхронизации CPU toc для выполнения.

Просто замечание для вашего времени.

Для уменьшения потребления памяти, вы можете использовать

W = gpuArray(rand(22000,22000,'uint8')); 

Это работает для cumsum на устройстве GPU.

 Смежные вопросы

  • Нет связанных вопросов^_^