2012-11-28 3 views
0

Я использую GPU вычисления с функцией arrayfun и gpuArray объекта, чтобы сделать поэлементную функцию на элементах переменной gpuArray на моей функции:Matlab GPU arrayfun общего переменной

[ output ] = MyFunc(element, SharedMatrix) 
// 
// Process element with Shared Matrix 
// 
end 

и мой код как так:

SharedMatrix = magic(5000); %Large Memory Object 
SharedMatrix = gpuArray(SharedMatrix); 
elements = magic(5); 
gpuElements = gpuArray(elements); 
//Error on next line, SharedMatrix object must be a scaler. 
result = arrayfun(@MyFunc,gpuElements,SharedMatrix); 

Я слышал, что глобальные переменные не могут быть использованы в GPU вычислений.

Есть ли способ сделать это с помощью arrayfun?

+0

Вы должны преобразовать SharedMatrix в gpuArray, а также. –

+0

Даже если бы я это сделал, он обрабатывал элемент по элементу не как целую матрицу. И он должен быть с той же размерностью, что и * gpuElements * matrix –

ответ

0

arrayfun в настоящее время требует, чтобы все входы были совместимыми размерами (или скалярами), а обработка выполнялась простым способом.

Кроме того, Parallel Computing Toolbox в Matlab не поддерживает Global Variables, поэтому это невозможно, используя Parallel Computing Toolbox.

0

Возможно, вы можете использовать handle class:

classdef VarByRefContainer < handle 
    properties 
     val = []; 
    end 
end 

handle = VarByRefContainer; 
handle.val = SharedMatrix; 
cellfun(@myfun, {handle, handle, handle}); 

Смотрите также this question.

3

Использование последних версий Parallel Computing Toolbox, это может быть сделано, например, с помощью вложенной функции в сочетании с arrayfun, например, так:

function result = gpueg() 

largeArray = gpuArray.rand(5000); 

smallArray = magic(5); 

    function out = myNestedFcn(in) 
    % nested function accesses 'smallArray'  
     element = ceil(in * 25); 
     out = smallArray(element); 
    end 

result = arrayfun(@myNestedFcn, largeArray); 

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