首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenMP实现循环中的向量分配和操作及并行化

用OpenMP实现循环中的向量分配和操作及并行化
EN

Code Review用户
提问于 2011-12-19 10:54:41
回答 1查看 1.2K关注 0票数 4

我使用这段代码来计算一个短时傅里叶变换:

代码语言:javascript
复制
// Output pre-allocation
std::vector<std::vector<std::complex<T> > > y(nFft, std::vector<std::complex<T> >(nFrames, 0.0));

std::vector<T> xt;
std::vector<std::complex<T> > yt;
xt.reserve(nFft);
yt.reserve(nFft);

#pragma omp parallel for private(xt,yt)
for (unsigned int t = 0; t < nFrames; ++t) {
    const int offset = -((int) wSize/2) + t*nHop;

    // Extract frame of input data
    if (offset < 0) {
        xt.assign(x.begin(), x.begin() + offset + wSize);
        xt.resize(wSize, 0.0);
    }
    else if (offset + wSize > n) {
        xt.assign(x.begin() + offset, x.end());
        xt.resize(wSize, 0.0);
    }
    else
        xt.assign(x.begin() + offset, x.begin() + offset + wSize);

    // Apply window to current frame
    std::transform(xt.begin(), xt.end(), w.begin(), xt.begin(), std::multiplies<T>());

    // Zero padding
    std::rotate(xt.begin(), xt.begin() + wSize/2, xt.end());
    xt.insert(xt.begin() + wSize/2, nFft - wSize, 0.0);

    yt = fft(xt);  // Perform the FFT!

    #pragma omp critical
    {
        for (unsigned int f = 0; f < nFft; ++f)
            y[f][t] = yt[f];
    }
}

在不牺牲可读性的情况下,无论是在设计风格上还是在性能上,我都可以改进吗?当然,重点是提高我的编码技能,而不使用任何外部库!

关于xt和yt向量,我将它们放在循环之外,以提高单线程(当OpenMP被禁用时)的性能。在多线程中,每个线程都会被复制(因此使用了私有关闭)。

EN

回答 1

Code Review用户

发布于 2011-12-19 16:34:43

唯一值得评论的是标识符名称可能更有意义。

  • 在维护代码时,很难找到短标识符(更多错误)。
  • 短的标识符使标识符很难有意义。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/6980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档