2015-01-08 18 views
0

我想了解如何處理在OSX中單個輸入參數數組的音頻呈現中使用多個CPU核心的可能性。CoreAudio:多線程後端OS X

在AudioToolbox中,一個渲染回調通常駐留在單個線程上,該線程似乎被單個CPU內核處理。

如何處理該內核上的輸入數據溢出,而其他3,5或7個內核幾乎處於閒置狀態?

當然,無法預先知道特定機器上有多少核心可用。 是否有(靜態或動態)將渲染回調分配給不同線程或「破壞塊」的方法? 有沒有一種方式可以精確地同步各自呈現回調並行(最高優先級)線程並行產生音頻緩衝區的時刻? 有沒有GCD API可能有什麼用?

在此先感謝!

PS。這個問題與我之前發佈的另一個問題有關: OSX AudioUnit SMP,不同之處在於我現在似乎更好地理解了問題的範圍。

+1

這是一個很好的問題,但我不認爲有答案。我不知道OS X上有任何機制允許線程在多個核上運行,或者影響渲染線程的數量。 – sbooth

回答

1

我不確定您是否在討論編寫「只」一個AudioUnit或整個應用程序。

如果你正在編寫一個完整的應用程序,你可以根據自己的需要設置自己的圖形,並且它們都有自己的回調函數,而這些回調函數都是在自己的線程中運行的。你也不需要同步你的回調函數,因爲它們都會在每個渲染週期被圖形調用一次,並且都會產生相同數量的幀(除非你另有指定)。

如果您正在編寫一個AudioUnit,因此僅限於一個回調,我會與GCD一起使用。由於您不是在那裏創建線程,而是分派單個任務,因此您不必知道機器有多少個內核。您只需將算法分成許多可以並行運行的小部件,系統將均勻分佈到所有內核中。缺點是,你永遠不會從回調線程獲得GCD的優先權。我還會在回調開始時進行一些計算,看看您有多少時間完成回調,並取決於限制您的GCD調用和調整渲染質量。如果你認爲GCD限制了你太多,我會嘗試pthreads,但是你真的需要知道你在做什麼,否則你會比GCD限制你自己的方式。

希望能讓你走向正確的方向。

+0

感謝您的回覆。我正在移植一箇舊的SGI/IRIX應用程序,而研究數據_sonification_是一個小而重要的部分。我盡我所能地使用蘋果代碼作爲真正需要的小代碼。如果您聲稱將任務分解爲兩個或四個並行的「克隆」AudioUnit可以比單獨的任務更好地完成任務,那麼我會盡力而爲,看看會發生什麼,儘管它使**變得複雜**。另一種預分割和線程耕作的策略也讓我感到有點不安全,因爲我不確定這樣的「推模式」與回調的「拉模式」是如何協同工作的。 – user3078414

+0

我將接受這個答案已成功完成個人研究,因爲它有助於向我展示最有效的研究方向。如果有人遇到這樣的問題,那麼我的文章系列和討論關於解決這類問題的學習有一個體面的記錄。謝謝! – user3078414

+0

不建議在CoreAudio中使用GCD。特別是從渲染線程。這個答案不應該是被接受的答案,因爲這個。在實時環境中工作時,您必須完全控制代碼。你不能調用任何可能阻塞的東西,因爲它可以分配內存,所以GCD不會給你這個保證。分配內存是一種潛在的阻塞。 –

0

我不完全確定,但我不認爲這是可能的。當然,Apple可以使用Accelerate.framework,它使用可用的資源。但是

渲染回調存在於實時優先級線程上,後續渲染調用異步到達。 Apple Documentation

在用戶級別上,您無法創建此類線程。

順便說一句,these slides by Godfrey van der Linden可能是有趣的你。

+0

感謝您的評論。恐怕矢量化和矩陣微積分不能應用於我正在處理的問題。感謝_van der Linden_會話鏈接。 – user3078414

+0

作爲用戶,您可以使用pthread創建實時優先級線程。您可以創建一個與CoreAudio渲染線程具有相同優先級的線程。 –