2013-06-27 55 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

它是安全的,因爲您不能修改上一級變量。通常很難說它是否有效 - 取決於您以這種方式訪問​​的數據量。 – Edric

+0

關鍵是我需要修改升級變量...我只是在Matlab中試過這個,它似乎工作 - 它並不妨礙我改變升級變量。在CPU上測試,尚未在GPU上測試。 –

相關問題