【问题标题】:Intel TBB, exececute a member function with a parallel forIntel TBB,执行一个具有并行的成员函数
【发布时间】:2018-01-27 20:30:54
【问题描述】:

我有一个类似的课程:

struct orden
{
 long long time;
 double price;
 const char* time1;
 orden(const char* t, double p) : time1(t),price(p){};
void convertToMs()
{
  time = dateToMs2(time1);
}
};

我正在做的是串行读取文件,执行结构的构造函数并将生成的对象保存在 orden 的向量中:

vector<orden> ord;
ifstream fe(filename)
while(getline(fe,order_line))
{
  price = stod(order_line.substr(position+2));
  time = order_line.substr(0,26).c_str();
  ord.push_back(time, price);
}

那么,我要并行执行的就是执行成员函数convertToMs()。但是我遇到了问题,因为编译器要求我只在 parallel for 中执行常量函数。

我尝试了一些想法,我发现像this one 没有成功,因为它们没有将执行结果保存在对象的参数中。

我做错了什么?

提前谢谢你

编辑:

如果我使用

struct orden
{
 long long time;
 double price;
 const char* time1;
 orden(const char* t, double p) : time1(t),price(p){};
 void convertToMs() const
 {
   time = dateToMs2(time1);
 }
};

我有以下错误:

In file included from pract1.cpp:5:0:
orden.h: In member function ‘void orden::convertToMs() const’:
orden.h:29:27: error: assignment of member ‘orden::time’ in read-only object
 time = dateToMs2(time1);

如果我删除 const 我有以下一个:

pract1.cpp: In lambda function:
pract1.cpp:158:43: error: passing ‘const value_type {aka const orden}’ as ‘this’ argument discards qualifiers [-fpermissive]
     ordersOfTheCompany[j].convertToMs();
                                       ^
In file included from pract1.cpp:5:0:
orden.h:27:8: note:   in call to ‘void orden::convertToMs()’
void convertToMs()

编辑 2:

再次抱歉,我有以下代码:

vector<orden> ord;
while(getline(fe,order_line))
{
  price = stod(order_line.substr(position+2));
  time = order_line.substr(0,26).c_str();
  ord.push_back(time, price);
}
tbb::parallel_for(tbb::blocked_range<size_t>(0,ord.size()),
[=](tbb::blocked_range<size_t>& r) {

  for(std::size_t j=r.begin(); j!=r.end(); ++j)
  {
    ord[j].convertToMs();
  }});

我正在尝试并行执行成员函数

【问题讨论】:

  • 你从编译器得到什么错误信息?这也缺少minimal reproducible example。特别是,它缺少几个使用的变量的声明。
  • @1201ProgramAlarm 抱歉,我已经编辑了错误的问题
  • 您的parallel_for有问题,但显示的代码中没有。

标签: c++ methods parallel-processing tbb


【解决方案1】:

parallel_fordocumentation 有一个与您正在尝试执行的操作类似的示例。它将结果保存到与输入数组不同的数组中。

在你的情况下,你想添加类似的东西

std::vector<long long> outTime;
outTime.resize(ord.size());

就在parallel_for 通话之前。然后,在您执行的 lambda 的主体中,将语句更改为

outTime[j] = ord[j].convertToMs();

在将convertToMs 更改为const 函数后,该函数返回转换后的值,而不是将其保存在本地。在parallel_for 返回后,将结果从outTime 复制回ord

您可以有两个版本的convertToMs,一个在内部保存结果的非常量版本,以及一个返回转换时间的const

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多