c++ std::future 运行 每个函数在一个单独的核心上
c++ std::future running each function on a separate core
这是一个实时音频应用程序 运行 在四核 Cortex A9 ARMv7(Linux 和 gcc 4.8.2)上运行,这是处理实际音频的部分(由调用其他函数)并被发送到音频驱动程序:
struct STEREOOUT
{
std::vector<float> L;
std::vector<float> R;
};
STEREOOUT ProcessEngine(int e, unsigned int sf)
{
STEREOOUT out;
for (unsigned int s=0; s<sf; ++s)
{
float l, r;
engine[e]->Process(l, r);
out.L.push_back(l);
out.R.push_back(r);
}
return out;
}
// This is the main audio loop callback!
int AudioProcess(void *outputBuffer, unsigned int sampleFrames)
{
float *buffer = (float*)outputBuffer;
unsigned int s(0);
STEREOOUT e0 = async(launch::async, &ProcessEngine, 0, sampleFrames).get();
STEREOOUT e1 = async(launch::async, &ProcessEngine, 1, sampleFrames).get();
for (; s<sampleFrames; ++s)
{
*buffer++ = e0.L[s] + e1.L[s];
*buffer++ = e0.R[s] + e1.R[s];
}
return 0;
}
如何确保 e1
和 e2
与 main()
程序具有 运行 不同的亲和力,但它们之间又有所不同?例如:
main() -> CPU0
e1 -> CPU1
e2 -> CPU2
我的代码,如您在此处看到的那样编译后,仍然 运行 在单核上显示。我需要两个音频处理占用两个不同的内核,以便利用四核处理器的全部功能。我是在做梦吗?
P.S.: 我知道,我过去已经发布过类似的问题,但这次我可以更精确,因为我现在有一个可以使用的完成的工作程序作为实际例子。
您在调用 std::async
后立即调用 get
,这将导致程序 等待结果可用。 您需要开始两个 异步任务在等待它们之前:
auto future1 = async(launch::async, &ProcessEngine, 0, sampleFrames);
auto future2 = async(launch::async, &ProcessEngine, 1, sampleFrames);
STEREOOUT e0 = future1.get();
STEREOOUT e1 = future2.get();
这是一个实时音频应用程序 运行 在四核 Cortex A9 ARMv7(Linux 和 gcc 4.8.2)上运行,这是处理实际音频的部分(由调用其他函数)并被发送到音频驱动程序:
struct STEREOOUT
{
std::vector<float> L;
std::vector<float> R;
};
STEREOOUT ProcessEngine(int e, unsigned int sf)
{
STEREOOUT out;
for (unsigned int s=0; s<sf; ++s)
{
float l, r;
engine[e]->Process(l, r);
out.L.push_back(l);
out.R.push_back(r);
}
return out;
}
// This is the main audio loop callback!
int AudioProcess(void *outputBuffer, unsigned int sampleFrames)
{
float *buffer = (float*)outputBuffer;
unsigned int s(0);
STEREOOUT e0 = async(launch::async, &ProcessEngine, 0, sampleFrames).get();
STEREOOUT e1 = async(launch::async, &ProcessEngine, 1, sampleFrames).get();
for (; s<sampleFrames; ++s)
{
*buffer++ = e0.L[s] + e1.L[s];
*buffer++ = e0.R[s] + e1.R[s];
}
return 0;
}
如何确保 e1
和 e2
与 main()
程序具有 运行 不同的亲和力,但它们之间又有所不同?例如:
main() -> CPU0
e1 -> CPU1
e2 -> CPU2
我的代码,如您在此处看到的那样编译后,仍然 运行 在单核上显示。我需要两个音频处理占用两个不同的内核,以便利用四核处理器的全部功能。我是在做梦吗?
P.S.: 我知道,我过去已经发布过类似的问题,但这次我可以更精确,因为我现在有一个可以使用的完成的工作程序作为实际例子。
您在调用 std::async
后立即调用 get
,这将导致程序 等待结果可用。 您需要开始两个 异步任务在等待它们之前:
auto future1 = async(launch::async, &ProcessEngine, 0, sampleFrames);
auto future2 = async(launch::async, &ProcessEngine, 1, sampleFrames);
STEREOOUT e0 = future1.get();
STEREOOUT e1 = future2.get();