【问题标题】:How to make loop with multi-core computation in VC++?如何在 VC++ 中使用多核计算进行循环?
【发布时间】:2016-06-29 13:28:44
【问题描述】:

不知道多核并行化。但是对于简单的循环,它可能会修改很少。对于以下示例,如何在 VC++ 中使用多核计算制作简单的循环?

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;

void foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g)
{
    for (int i = 0; i < n; ++i)
    {
        a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]);
    }
}

int main()
{
    int m = 1001001;
    vector<double> a(m), b(m), c(m), d(m), f(m);

    std::clock_t startcputime = std::clock();
    for (int i = 0; i < 1000; ++i)
        foo(1000000, &a[0], &b[0], &c[0], &d[0], &d[1], &f[0], &f[1000]);
    double cpu_duration = (std::clock() - startcputime) / (double)CLOCKS_PER_SEC;
    std::cout << "Finished in " << cpu_duration << " seconds [CPU Clock] " << std::endl;
}

【问题讨论】:

  • 我认为你的第一步应该是学习并发和并行的基础知识,这样你就有了“一些想法”。

标签: c++ visual-c++ multicore


【解决方案1】:

并行模式库(VC++ 的一部分)中的 concurrency 命名空间包含 parallel_for,这正是您想要的。

void parallel_foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g)
{
    concurrency::parallel_for(static_cast<size_t>(0), static_cast<size_t>(n), [&](size_t i) {
        a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]);
    });
}

我建议将size_t 用于“n”。这样它会变得更干净一些:

void parallel_foo(size_t n, double* a, double* b, double *c, double*d, double* e, double* f, double* g)
{
    concurrency::parallel_for(0, n, [&](size_t i) {
        a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]);
    });
}

你也应该看看msdn的例子

您可以使用“amp”作为替代。它更强大、更复杂。

【讨论】:

    【解决方案2】:

    您可以使用OpenMP,只需在for 循环之前添加#pragma omp parallel for

    void foo(int n, double* a, double* b, double *c, double*d, double* e, double* f, double* g)
    {
        #pragma omp parallel for
        for (int i = 0; i < n; ++i)
        {
            a[i] = b[i] * a[i] + c[i] * (d[i] + e[i] + f[i] + g[i]);
        }
    }
    

    另外,如果您使用 Microsoft Visual Studio,您需要在设置中启用OpenMP Support

    1. 打开项目的“属性页”对话框。
    2. 展开配置属性节点。
    3. 展开 C/C++ 节点。
    4. 选择语言属性页。
    5. 修改 OpenMP 支持属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      相关资源
      最近更新 更多