2013-03-16 99 views
2

我正在處理mex文件中的一些內存,並將句柄傳回給matlab。有沒有辦法處理用戶清除或刪除存儲在matlab變量中的特定句柄的事件,我知道它也可以在mex文件中刪除。如何在matlab中銷燬變量時,如何銷燬mex文件中的內存?

+0

您能否提供更多信息?通常你自己將參數傳遞到mex文件中,以便在調用mex函數之前測試它們是否與exist()函數一起存在。 – Justin 2013-03-16 18:59:33

+0

我在GPU上分配一些內存並返回一個指向matlab的指針。在matlab中,這顯示爲X具有一些uint64值。如果我在matlab中刪除X.內存仍然分配在GPU上。我想在用戶刪除或覆蓋matlab中的變量X時觸發某種方法。 – 2013-03-16 19:26:47

+0

因此,在mex文件返回指向gpu上的內存的指針之後,如何在gpu中的內存上進行算術運算?你叫另一個mex功能嗎? – Justin 2013-03-16 19:47:03

回答

3

聽起來就像您試圖將MEX層內管理的分配的生命週期鏈接到正在使用它們的M代碼級結構的生命週期。您可能想要將這些原始uint64句柄值封裝在支持清理回調的Matlab數據結構中。

您可以將它們包裝在您定義的Matlab的handle子類中,併爲其指定一個delete方法,該方法可以調用ocl_mex來執行相應的清理。 Delete是一個析構函數,當從Matlab工作空間中清除了對象的最後一個副本時,它將自動被調用。 (一旦你使用了對象,你可以提供對應於各種ocl_mex調用形式的更簡潔的方法,更好的顯示方式,或許使用運算符重載乘法的語法,等等。)詳見http://www.mathworks.com/help/matlab/matlab_oop/handle-class-destructors.html。這可以很好地工作,如果你然後使mex函數在類中的私有函數。使您可以輕鬆地在您的mex訪問中添加調試日誌記錄和完整性檢查等。

代碼可能看起來有點像這樣。

class ocl < handle 
    properties (SetAccess = private) 
     ocl_handle # the raw uint64 handle the MEX layer works with 
    end 
    methods 
     function out = ocl(mex_handle) # maybe make this private 
      out.ocl_handle = mex_handle; 
     end 
     function delete(obj) 
      if ~isempty(obj.ocl_handle) 
       ocl_mex(obj.ocl_handle, 'cleanup'); 
      end 
     end 
     function out = mat_mult(A, B) 
      handle_c = ocl_mex('mat_mult', A.ocl_handle, B.ocl_handle); 
      out = ocl(handle_c); # And now the new handle has a cleanup hook, too... 
     end 
    end 
    methods (Static = true) 
     function out = allocate(some_args) 
      new_handle = ocl_mex([], 'allocate', some_args); 
      out = ocl(new_handle); 
     end 
    end 
end 

如果你想避免使用類,你也可以把它們粘在一個普通的結構,並使用onCleanup創建時的最後一個副本被清除自動被調用的回調。

問題是你必須確保對句柄的所有訪問都通過對象或結構,並且沒有東西彈出來並「泄漏」原始句柄值。更容易執行對象。

+0

這就是我真正想要的第一個地方,但找不到我在找什麼。我在我的mex上創建了清理方法,但我的問題是如果用戶刪除了句柄,他無法調用清理。謝謝我將使用這種方法。 – 2013-03-18 10:54:11