2016-06-21 49 views
2

理由使用自定義的分配器在第三方過濾器:強制第三方DirectShow過濾器使用自定義的分配器

我有一個NUMA系統,並具有過濾器的性能問題,並丟棄錯誤的NUMA節點結果分配內存從相機收到的圖像。

我目前的做法:

我會寫的遍歷所有的過濾器,並要求他們,如果他們輸入引腳的分配的功能。然後,我要求這個分配器爲我的特殊分配器接口,最後如果沒有找到接口,我創建新的自定義分配器,並應用與以前的分配器相同的屬性。然後我在輸入引腳上調用NotifyAllocator來通知它有關新的分配器。

我試圖在圖形構建的不同時間調用這個函數;目前在IMediaControl::PauseIMediaControl::Run之前,但我的自定義分配器沒有被任何第三方過濾器使用。這些示例位於錯誤的NUMA節點上。

此外,我還跟蹤IMediaControl::Pause通話過程中創建的線程和改變自己的線程關聯到正確的CPU因此通常這些DirectShow過濾器應該有正確的NUMA節點,他們應該自己動作CPU的NUMA節點上分配。

回答

0

您不能用NotifyAllocator覆蓋分配器。輸出引腳決定要使用的分配器,在內部存儲指針並通知輸入引腳。至少不能在引腳連接的狀態下從外部替換分配器。

有些過濾器依賴於自己的分配器,並且無法與其他工作。對於分配器替換沒有通用的解決方案,特定的過濾器可能被輸出引腳對分配器沒有特定要求並要求對等輸入引腳提供合適實例的事實欺騙。

+0

我猜測,但如何確保樣本在同一個NUMA節點上?分配器接口或「ALLOC_PROPERTIES」沒有任何選項來確保這種屬性。 也許我應該更專注於線程親和力,但這不是100%的工作解決方案 –

+0

我不確定您是否可以可靠地實現這一點,所有工作都使用已建立的過濾器,而過濾器對NUMA一無所知。你應該有更多的選擇,你正在做一個自定義的過濾器 - 你自然選擇分配器,然後,你也可以控制你創建的線程和你從更遠流的線程。 –

+0

在這種情況下,我們所說的第三方過濾器是一個視頻壓縮過濾器。所以最初的計劃是讓用戶從已安裝的壓縮過濾器中進行選擇,而不是創建自定義壓縮過濾器。 我能想到的唯一的其他解決方案是在視頻內存中完成所有處理。但是如果我沒有記錯的話,我需要重寫MFT中的所有內容。 –