2014-01-05 2 views
2

저는 MATLAB에서 3d 행렬의 for-loop를 가지고 있으며, 이것을 arrayfun으로 바꾸고 싶습니다. 그러면 GPU에서 병렬로 실행될 것입니다.convolutions의 for 루프를 arrayfun으로 대체하는 방법은 무엇입니까?

또한 여기에 전체 루프를 제거하는 방법이 느낌,하지만 확실하지 여기에 :)

내 코드, 어떤 제안이 얼마나? 감사.

for i=1:size(obj.W, 3) 
    d(:, :, :, i) = convn(prev_delta(:, :, :, i), ... 
     flipped_W(:, :, i), 'full'); 
end 
+0

이 작업을 위해 GPU를 사용하는 것이 목적이라면, 'parfor'를 사용하여 GPU를 직접 구현할 수 있습니다. http://www.cac.cornell.edu/matlab/TechDocs/Examples/BestPracticesGPU.aspx –

+0

parfor GPU가 아닌 CPU 코어 전반에 걸쳐 for 루프를 병렬 처리합니다. 임의의 경우 parfor로 테스트했는데 성능이 향상되지 않았습니다. CPU에 4 개의 코어가 있습니다. – Ran

+0

'arrayfun' (그리고'gpuArray/arrayfun')은 배열의 각 요소 *에 함수를 적용합니다. 하나의 차원을 반복하면서 전체 배열에'convn '을 적용합니다. 'convn'을 스스로 구현하고 싶지 않다면'arrayfun'이 적용 가능한지 확신 할 수 없습니다. 또한, 나는 모른다. 그러나'gpuArray/convn'은 이미 스스로 병렬화 될 수있다. – horchler

답변

0

입력 배열을 구조체 배열로 변환하고 arrayfun을 적용하는 것이 도움이 되나요?

코드를 테스트하지 않았으므로 시도 할 수 있습니다.

c = cell(size(obj.W, 3), 2); 
p = prev_delta; 
cell_p = squeeze(mat2cell(size(p,1),size(p,2),size(p,3),ones(1,size(p,4)))); 
w = flipped_W; 
cell_w = squeeze(mat2cell(size(w,1), size(w,2),ones(1,size(w,3)))); 

c(:,1) = cell_p; 
c(:,2) = cell_w; 

names = {'p','w'}; 

s = cell2struct(c, names, 2); 

d = arrayfun(@(x)(covn(x.p, x.w, 'full'), s); 

d의 반환 값을 처리해야합니다.

+0

몇 가지 수정 사항을 적용하면 코드가 작동하지만 for 루프보다 약 3 배 느립니다. – Ran

+0

@Ran : 예,'arrayfun'을 호출하는 것입니다. 죄송합니다. GPU에 익숙하지 않습니다. @horchler가 말했듯이 GPU에 데이터를 보내려면'gpuArray'를 사용해야합니다. 하지만 불행히도 gpuArray는 기본 배열과 스칼라 만 지원하므로 s를 GPU로 보낼 수 없습니다. 아마도 CUDA 코드를 프로그래밍해야합니다. – misssprite

관련 문제