2013-06-27 2 views
1

this question과 비슷하게 GPU에서 실행중인 cellfun 스레드간에 행렬을 공유하려고합니다.GPU의 cellfun 스레드간에 메모리를 공유 할 수 있습니까?

GPU 실행은 전역을 지원하지 않으므로 공유 행렬에 대한 참조로 핸들 클래스 객체 배열을 정의 할 수 있으므로 핸들이 각 cellfun 인스턴스로 전달됩니다.

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

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

matlab에

는 이것을 받아 들일 것 같다,하지만 몇 가지 질문이 남아 :이 안전한가요

  1. 은? 나는. 요소 [1,3,5]와 [2,4]에 값을 병렬로 할당하면 할당이 충돌 할 가능성이 있습니까?
  2. 이것이 효율적입니까? 나는. 핸들러 클래스가 호스트에 저장 될 수 있으며 GPU의 메모리를 참조하는 데 시간이 많이 소요될 수 있습니다. 나는 그것을 피하고 싶습니다.

답변

1
내가 다른 질문으로 여기에 같은 대답을 게시합니다

- 당신이 수준 변수와 중첩 기능을 사용하여 데이터를 공유 할 수 있습니다

function result = gpueg() 

largeArray = gpuArray.rand(5000); 

smallArray = magic(5); 

    function out = myNestedFcn(in) 
    element = ceil(in * 25); 
    out = smallArray(element); 
    end 

result = arrayfun(@myNestedFcn, largeArray); 

end 
+0

사운드 좋은! 이것은 안전하고 효율적입니다. –

+0

up-level 변수를 수정할 수 없기 때문에 안전합니다. 효율성 여부는 일반적으로 말하기 어렵습니다. 얼마나 많은 데이터를이 방식으로 액세스하는지에 달려 있습니다. – Edric

+0

요점은 내가 상위 레벨 변수를 수정해야한다는 것입니다 ... 저는 방금 MATLAB에서 이것을 시도해 보았습니다. 그리고 그것은 작동하는 것 같습니다. 그것은 상위 레벨 변수를 변경하지 못하게합니다. GPU에서 아직 테스트되지 않은 CPU에서 테스트되었습니다. –

관련 문제