我有一个关于Microsoft PPL库和一般并行编程的问题.我正在使用FFTW执行64 x 64 x 64 FFT和反FFT的大集(100,000).在我当前的实现中,我使用并行for循环并在循环中分配存储阵列.我注意到在这些情况下我的CPU使用率仅为60-70%. (注意,这仍然比我测试的FFTW提供的内置线程FFT更好的利用率).由于我使用的是fftw_malloc,是否可能发生过度锁定而导致无法完全使用?
鉴于此,建议在主处理循环之前为每个线程预分配存储数组,因此循环内部不需要锁定吗?如果是这样,MSFT PPL库如何实现?我之前一直在使用OpenMP,在这种情况下,使用提供的函数获取线程ID非常简单.然而,我没有在PPL文档中看到类似的功能.
最佳答案 我只是回答这个问题,因为还没有人发布任何内容.
如果需要大量锁定,互斥锁(e)可能会对性能造成严重破坏.此外,如果需要大量内存(重新)分配,这也会降低性能并将其限制为内存带宽.就像你说的那样,后期线程运行的预分配可能很有用.但是,这需要您拥有固定的线程数,并且您可以在所有线程上平衡您的工作负载.
关于PPL thread_id函数,我只能谈论Intel-TBB,但它应该与PPL非常类似. TBB – 我想也是PPL – 不直接谈论线程,而是谈论任务,TBB的目的是将这些底层细节抽象出用户,因此它不提供thread_id函数.