如何在VC++中使用多核计算进行循环?
How to make loop with multi-core computation in VC++?
对多核并行化一无所知。但是对于简单的循环,它可能修改得很少。对于下面的例子,如何在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;
}
并行模式库(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]);
});
}
我建议对 'n' 使用 size_t
。这样它会变得更干净一些:
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' 作为替代。它更强大也更复杂。
您可以使用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
- 打开项目的 属性 页面对话框。
- 展开配置属性节点。
- 展开 C/C++ 节点。
- Select 语言 属性 页面。
- 修改 OpenMP 支持 属性。
对多核并行化一无所知。但是对于简单的循环,它可能修改得很少。对于下面的例子,如何在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;
}
并行模式库(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]);
});
}
我建议对 'n' 使用 size_t
。这样它会变得更干净一些:
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' 作为替代。它更强大也更复杂。
您可以使用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
- 打开项目的 属性 页面对话框。
- 展开配置属性节点。
- 展开 C/C++ 节点。
- Select 语言 属性 页面。
- 修改 OpenMP 支持 属性。