- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习如何使用 TBB,因此我正在修改我发现的示例程序,该程序旨在计算复数数组的幂。最初,它是将一个数组传递到 parallel_for 循环中,但我试图对其进行更改,以便它传递一个 vector 。但是,我无法编译我的代码;我收到以下错误(使用 g++ -g program_name.cpp -ltbb 编译):
error: passing ‘const std::complex<double>’ as ‘this’ argument
discards qualifiers [-fpermissive] result[i] = z;
我的代码如下:
#include <cstdlib>
#include <cmath>
#include <complex>
#include <ctime>
#include <iostream>
#include <iomanip>
#include "tbb/tbb.h"
#include "tbb/blocked_range.h"
#include "tbb/parallel_for.h"
#include "tbb/parallel_for_each.h"
#include "tbb/task_scheduler_init.h"
using namespace std;
using namespace tbb;
typedef complex<double> dcmplx;
dcmplx random_dcmplx ( void )
{
double e = 2*M_PI*((double) rand())/RAND_MAX;
dcmplx c(cos(e),sin(e));
return c;
}
class ComputePowers
{
vector<dcmplx> c; // numbers on input
int d; // degree
vector<dcmplx> result; // output
public:
ComputePowers(vector<dcmplx> x, int deg, vector<dcmplx> y): c(x), d(deg), result(y) { }
void operator() ( const blocked_range<size_t>& r ) const
{
for(int i=r.begin(); i!=r.end(); ++i)
{
dcmplx z(1.0,0.0);
for(int j=0; j < d; j++) {
z = z*c[i];
};
result[i] = z;
}
}
};
int main ( int argc, char *argv[] )
{
int deg = 100;
int dim = 10;
vector<dcmplx> r;
for(int i=0; i<dim; i++)
r.push_back(random_dcmplx());
vector<dcmplx> s(dim);
task_scheduler_init init(task_scheduler_init::automatic);
parallel_for(blocked_range<size_t>(0,dim),
ComputePowers(r,deg,s));
for(int i=0; i<dim; i++)
cout << scientific << setprecision(4)
<< "x[" << i << "] = ( " << s[i].real()
<< " , " << s[i].imag() << ")\n";
return 0;
}
最佳答案
您正在尝试修改非 mutable
成员(member)栏result
在const
-合格operator()
.
解决这个差异。
编辑 #1: 我已经在上面提到了两个关键字。要么:
删除 const
来自 operator()
的限定符:
void operator() ( const blocked_range<size_t>& r ) { ... }
制作result
mutable
:
mutable vector<dcmplx> result;
应用(尽管强烈推荐)变体号后可能会出现其他错误。 1. 2号只是为了完整性,仅在marginal situations中使用.
它确实会导致第一个变体出错。这是因为 tbb::parallel_for
需要 Func
通过 const&
, 所以它只能调用 const
- 仿函数上的限定成员函数。为什么? TBB 不想通过复制大型仿函数来浪费性能(STL 按值传递它们)。
我不知道这里的常见做法是什么,我从未使用过这个库。
编辑 #2: 可能您所缺少的只是 result
不是引用:
vector<dcmplx> &result;
现在您可以修改它,即使在 const
中也是如此-合格operator()
.修改一个随后被破坏的成员是没有意义的。
不要忘记更改构造函数的签名以传递 y
也通过引用。
代码中的离题问题:
不包括 <vector>
标题
using namespace bulky_namespace
全局
不使用 size_t
对于 i
在for
-循环
也许更多...
关于C++ parallel_for 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667936/
要并行执行一个循环,我正在使用: int testValues[16]={5,2,2,10,4,4,2,100,5,2,4,3,29,4,1,52}; parallel_for (1, 100, 1,
我有 3 次嵌套循环,而与最内层循环相比,两个外部循环只循环了很少的次数。像这样: for (int i = 0; i < I; i++) { for (int j = 0; j <
我正在尝试学习如何使用 TBB,因此我正在修改我发现的示例程序,该程序旨在计算复数数组的幂。最初,它是将一个数组传递到 parallel_for 循环中,但我试图对其进行更改,以便它传递一个 vect
我刚刚在新的 OpenCV 2.4.3 中看到他们添加了一个通用的 parallel_for。所以按照这个 example ,我尝试自己实现。我用我的代码实现了所有功能,但是当我对它的处理进行计时与使
我是 C++ 的新手,因此如果这是一个愚蠢的问题请原谅,但我没有在互联网上找到我正在寻找的很好的例子。 基本上,我使用 parallel_for 循环来查找 2D 数组中的最大值(以及其间的一系列其他
我已经使用opencv人脸检测器编写了多 View 人脸检测代码。我在一个图像上运行五个检测器(针对不同的姿势 Angular 进行训练),然后权重检测图像中的人脸。我已经使用TBB parallel
我正在尝试学习一些关于 TBB 的知识,但我怀疑我无法解决它。 Afaik,TBB 使用线程池,因此它不需要一直创建线程。如果你使用 tbb::parallel_for,它是使用这个线程池还是创建新线
我正在制作一个简单的 native MFC 应用程序,我正在使用并发命名空间来执行一个简单的并行程序(绘制一个 Mandelbrot 集)。到目前为止,该程序非常基础,单击一个按钮并行绘制,另一个按钮
我对并行循环中的局部值和更新全局变量有疑问。 例如,在伪代码中:我在一个很长的 vector 中搜索最大值。我可以像这样循环执行: int max; for(i ...) { if (max
我一直在研究并行循环 (C++11) 并使用 MS visual studio 2013 对其进行测试。我很清楚它们(尤其是 lambdas),它们非常酷。 但我担心的是我必须调用一个函数来执行简单的
我有一段代码,我正在使用 tbb::parallel_for 对一个循环进行多线程处理,该循环由主线程调用。在那个循环中,我需要主线程来更新 UI 以反射(reflect)进度。据我观察,tbb::p
我想使用 TBB parallel_for 我已将其添加到我的代码中进行测试 #include #include #include std::vector> commands; auto n =
我最初有一个单线程循环,它遍历图像的所有像素,并且可以对数据进行各种操作。 我使用的库规定从图像中检索像素必须一次一行完成。为此,我 malloc 一个内存块,它可以容纳一行像素(BMM_Color_
摆脱 parallel_for 的最有效方法是什么?为了摆脱标准的 for 循环,我们执行以下操作: for(int i = 0; i < 100; i+) { bool bValue = D
我有一个数据集,我想以 interval_size 大小的间隔使用 tbb::parallel_for。我的仿函数消耗的每个区间都应该是 interval_size,最后一个部分区间除外,当 inte
我刚刚学会了如何并行使用一个函数。以下代码行计算索引的平方值并将其放入数组(称为平方)中的该索引处。 parallel_for 函数在 Visual Studio 2010 中可用,作为标题下并发命名
我使用 OpenMP (OMP) 并行化 for 循环。但是,OMP 似乎会将我的 for 循环划分为相等的间隔大小,例如 for( int i = 0; i < n; ++i ) { ... }
如何限制使用的线程数 Concurrency::parallel_for(0, 100, 1, [&](int k) 我看到了调度程序/任务的想法,我没有在并行内部使用它,因为有很多逻辑,我需要传递参
我有一个像这样的模板可变函数需要与 TBB 并行化 parallel_for功能 template void func(T1 t1, T2 t2, std::size_t n, T3... t3) 我
我有一个 for 循环,我想将其转换为 parallel_for fnc 调用。我的代码满足此转换成功的所有条件(在 Parallel_Programming_with_Microsoft_Visua
我是一名优秀的程序员,十分优秀!