Multithreading “使用”是否切实可行;“粗制的大锤”;并行化MacOS/CoreAudio实时音频回调的方法?

Multithreading “使用”是否切实可行;“粗制的大锤”;并行化MacOS/CoreAudio实时音频回调的方法?,multithreading,audio,real-time,core-audio,multicore,Multithreading,Audio,Real Time,Core Audio,Multicore,首先,一些相关的背景信息:我有一个基于CoreAudio的低延迟音频处理应用程序,它对来自专用Mac(运行最新版本的MacOS)上的输入设备的音频进行各种混音和特效,并将结果发送回Mac的一个本地音频设备 为了获得最佳/最可靠的低延迟性能,该应用程序设计用于连接CoreAudio的低级音频渲染回调(通过、AudioDeviceStart()等),每次调用回调函数时(从CoreAudio的实时上下文),它都会读取传入的音频帧(例如128帧,每帧64个样本),做必要的数学运算,写出输出样本 这一切都

首先,一些相关的背景信息:我有一个基于CoreAudio的低延迟音频处理应用程序,它对来自专用Mac(运行最新版本的MacOS)上的输入设备的音频进行各种混音和特效,并将结果发送回Mac的一个本地音频设备

为了获得最佳/最可靠的低延迟性能,该应用程序设计用于连接CoreAudio的低级音频渲染回调(通过、AudioDeviceStart()等),每次调用回调函数时(从CoreAudio的实时上下文),它都会读取传入的音频帧(例如128帧,每帧64个样本),做必要的数学运算,写出输出样本

这一切都很好,但从我所读到的一切来看,苹果的CoreAudio实现有一个不成文的事实要求,即所有实时音频操作都在一个线程中进行。我承认这有很好的理由(主要是在我已经使用的SIMD/SSE/AVX指令之外,几乎所有用于协调并行行为的机制都不是实时安全的,因此尝试使用它们会导致间歇性的故障)

然而,我和我的同事都很贪婪,尽管如此,我们还是希望在每个样本缓冲区中执行更多的数学运算,而不是在短时间内,即使是最快的单核也能可靠地执行,这是避免音频不足和故障的必要条件

我的同事(他在嵌入式/专门构建的Linux硬件上具有相当丰富的实时音频处理经验)告诉我,在Linux下,一个程序可以为一个或多个CPU内核申请独占访问权,这样操作系统就不会尝试将其用于其他任何用途。一旦他做到了这一点,他就可以在CPU上运行“裸机”风格的代码,只需在原子变量上忙着等待/轮询,直到“真正的”音频线程更新它,让专用内核知道该做它的事情了;此时,专用内核将在输入样本上运行其数学例程,并在(希望)有限的时间内生成其输出,此时“真实”音频线程可以收集结果(此处更忙的等待/轮询),并将其合并回传出音频缓冲区

我的问题是,这种方法值得在MacOS/X下尝试吗?(即,MacOS/X程序(即使是具有根访问权限的程序)能否说服MacOS以独占方式访问某些内核,如果是,这些内核上的等待/轮询循环(包括相对于其输入/输出要求同步CoreAudio回调线程所需的轮询循环)是否会停止产生足够可靠的实时结果,以至于有一天你可能想在付费观众面前使用它们?)

这在原则上似乎是可能的,但在我花太多时间把头撞到任何可能存在的墙壁之前,我想了解一下这是否是一条值得在这个平台上追求的途径

MacOS/X程序,即使是具有root访问权限的程序,是否能够说服MacOS授予它对某些内核的独占访问权限

我不知道这一点,但您可以使用任意数量的内核/根据需要进行计算,使用任何同步方法使其工作,然后使用免锁环形缓冲区将音频传递到您的
IOProc
,如

但是你的问题让我想起了一个新的MacOS11/IOS14API,我一直想尝试,()

我的理解是,该API允许您使用音频实时线程属性“祝福”非IOProc,或者至少与音频线程更好地合作

文档区分了线程(这听起来像你的案例)和(这听起来像我的建议),我不知道哪个案例更适合你

我仍然不知道在实践中,当你使用
音频工作组时会发生什么,无论他们是选择你加入好的东西还是选择你退出坏的东西,但是如果他们不是你正在寻找的锤子,他们可能有一些有用的锤子状属性