在多线程程序中使用exprtk
Using exprtk in a multithreaded program
我需要编写一个程序,其中字符串表达式的计算非常频繁。下面是一个表达式的例子:
"x0*a0*a0+x1*a1+x2*a2+x3*a3+x4*a4....."
表达式可以是长表达式,一个字符串可以包含多个这样的表达式。
我用c++库exprtk写了一些测试代码。
vector<std::string> observation_functions;
vector<std::string> string_indices;
template<typename T>
float* get_observation(float* sing_j, float* zrlist, int num_functions,int num_variables)
{
//omp_set_nested(1);
float* results = (float*)malloc(sizeof(float)*num_functions);
exprtk::symbol_table<float> symbol_table;
exprtk::expression<T> expression;
exprtk::parser<T> parser;
int i;
for( i = 0; i < num_variables; i++)
{
symbol_table.add_variable("x"+string_indices[i], sing_j[i]);
symbol_table.add_variable("a"+string_indices[i], zrlist[i]);
}
expression.register_symbol_table(symbol_table);
for(i = 0; i < num_functions; i++)
{
parser.compile(observation_functions[i],expression);
results[i] = expression.value();
}
return results;
}
int main()
{
for( int i = 0; i < 52; i++)
{
ostringstream s2;
s2<<i;
string_indices.push_back(s2.str());
}
string hfun ="x0*a0*a0+x1*a1+x2*a2+x3*a3+x4*a4+x5*a5+x6*a6+x7*a7+x8*a8+x9*a9+x10*a10+x11*a11+x12*a12+x13*a13+x14*a14+x15*a15+x16*a16+x17*a17+x18*a18+x19*a19+x20*a20+x21*a21+x22*a22+x23*a23+x24*a24+x25*a25+x26*a26+x27*a27+x28*a28+x29*a29+x30*a30+x31*a31+x32*a32+x33*a33+x34*a34+x35*a35+x36*a36+x37*a37+x38*a38+x39*a39+x40*a40+x41*a41+x42*a42+x43*a43+x44*a44+x45*a45+x46*a46+x47*a47+x48*a48+x49*a49+x50*a50+x51*a51 ";
boost::split(observation_functions, hfun, boost::is_any_of(" "));
float *a=(float*)malloc(52*sizeof(float));
float* c=(float*)malloc(52*sizeof(float));
struct timeval t0,t1;
gettimeofday(&t0, 0);
for(int j=0; j < 210; j++)
#pragma omp parallel for schedule(static,1) num_threads(8)
for(int i=0;i<104;i++)
float* b =get_observation<float>(a,c,1,52);
gettimeofday(&t1, 0);
long elapsed = (t1.tv_sec-t0.tv_sec)*1000000 + t1.tv_usec-t0.tv_usec;
cout<<"elapsed:"<<elapsed<<endl;
}
注意,这是测试代码。在实际中,每个线程将使用一组不同的值来计算表达式。这段代码工作得很好,但我需要使它运行得更快。
基于其他一些实验,我发现我不能与多个线程共享单个符号表来更快地计算单个表达式。在多个线程之间共享符号表会导致内存损坏错误。
有没有人能给我一些建议,告诉我怎样才能提高性能。
假设您有N
线程。然后,在主程序(在函数外,在for
循环外)中创建exprtk
相关对象(包括symbol_table
, expression
, parser
)的N
集。
您可以使用vector<>
来存储它们:例如,对于expression
对象,它将使用vector<expression> expressions;
然后,在调用函数时将引用传递给这些对象,
for(int i=0;i<104;i++)
get_observation<float>(expressions[i], more params here..)
模板函数定义:template <typename T> T* get_observation(expression & exp, more params here..)
您也可以创建一组对象并通过复制创建其他对象,如Aloalo所建议的。
注:更喜欢使用智能指针,https://stackoverflow.com/a/19042634不要忘记删除本地某处分配的内存
您可以尝试只构建一次exprtk对象,并为每个线程创建一个副本。如果复制exprtk对象比构造exprtk对象快,那么这应该更快。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 在多线程程序中使用exprtk