使用std :: thread没有性能提升

时间:2014-11-09 22:33:46

标签: c++ multithreading performance audio stdthread

我正在制作音频"实时"应用程序,我想改善它的性能。我实际上已经发布了一个主题,但这是关于std :: thread特定的。

音频处理主要由两个单独的对象(leftProcessor轨道和rightProcessor)完成。由于这些对象并不相互依赖,因此使用两个线程来处理它们应该可以通过多核CPU来提高性能。但是,我目前得到了相反的结果。

在我激活编译器性能优化(O2)之前,使用两个线程使我的性能提高了约50%,但在我开启优化后,性能降低了约10-20%,而性能却大大提高了两个版本。

我通过在功能中的两个点花费时间来测量性能,并将结果强制打印到屏幕上,因此可能存在一些问题。 ;)

我的猜测是创建一个std::thread会花费更多的时间,而不是在第二个线程上运行处理。 在这种情况下,是否可以通过使用相同的"线程来提高性能。对于每个函数调用,只是传递线程的新参数?我不知道这是否可能。

该功能目前需要大约0.0005ms到0.002ms来处理。

以下是代码:

void AudioController::processAudio(int frameCount, float *output) {

#ifdef AUDIOCONTROLLER_MULTITHREADING
    // CALCULATE RIGHT TRACK
    std::thread rightProcessorThread;
    if(rightLoaded) {
        rightProcessorThread = std::thread(&AudioProcessor::tick,  //function
                                           rightProcessor,         //object
                                           rightFrameBuffer,       //arg1
                                           frameCount);            //arg2
    } else {
        for(int i = 0; i < frameCount; i++) {
            rightFrameBuffer[i].leftSample  = 0.0f;
            rightFrameBuffer[i].rightSample = 0.0f;
        }
    }

#else
    // CALCULATE RIGHT TRACK
    if(rightLoaded) {
        rightProcessor->tick(rightFrameBuffer, frameCount);     
    } else {
        for(int i = 0; i < frameCount; i++) {
            rightFrameBuffer[i].leftSample  = 0.0f;
            rightFrameBuffer[i].rightSample = 0.0f;
        }
    }

#endif

    // CALCULATE LEFT TRACK
    Frame * leftFrameBuffer = (Frame*) output;

    if(leftLoaded) {
        leftProcessor->tick(leftFrameBuffer, frameCount);       
    } else {
        for(int i = 0; i < frameCount; i++) {
            leftFrameBuffer[i].leftSample  = 0.0f;
            leftFrameBuffer[i].rightSample = 0.0f;
        }
    }

#ifdef AUDIOCONTROLLER_MULTITHREADING
    // CALCULATE RIGHT TRACK
    if(rightLoaded) {
        rightProcessorThread.join();
    }
#endif

    // MIX
    for(int i = 0; i < frameCount; i++ ) {
        leftFrameBuffer[i] = volume * (leftRightMix * leftFrameBuffer[i] + (1.0 - leftRightMix) * rightFrameBuffer[i]);
    }

}

0 个答案:

没有答案