Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在多线程程序中使用exprtk_C++_Multithreading_Performance_Openmp_Exprtk - Fatal编程技术网

C++ 在多线程程序中使用exprtk

C++ 在多线程程序中使用exprtk,c++,multithreading,performance,openmp,exprtk,C++,Multithreading,Performance,Openmp,Exprtk,我需要编写一个程序,其中字符串表达式的计算非常频繁。表达式的示例如下所示: "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>

我需要编写一个程序,其中字符串表达式的计算非常频繁。表达式的示例如下所示:

"x0*a0*a0+x1*a1+x2*a2+x3*a3+x4*a4....."
表达式可以很长,一个字符串可以包含多个这样的表达式

我使用C++库EXPRTK.</P>编写了一些测试代码。

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;

}   
矢量观测函数;
向量字符串索引;
模板
float*get_观测(float*sing_j、float*zrlist、int num_函数、int num_变量)
{
//omp_集合_嵌套(1);
float*结果=(float*)malloc(sizeof(float)*num_函数);
exprtk::symbol\u table symbol\u table;
exprtk::表达式;
解析器;
int i;
对于(i=0;is2您只能尝试构建一次exprtk对象,并为每个线程创建一个副本。如果exprtk对象的复制速度快于构建它们,则应该更快。

假设您有
N
个线程。然后,创建
N
exprtk
相关对象(包括
symbol\u表
表达式
解析器
)在程序中(函数外部循环的
外部)

您可以使用
vector
来存储它们:例如,对于
expression
对象,它将是
vector expressions;

然后,在调用函数时,将引用传递给这些对象

for(int i=0;i<104;i++)
    get_observation<float>(expressions[i], more params here..)

对于(int i=0;i考虑使用
std::vector&zrlist
。然后还可以使用
symbol\u表。添加向量(“a”,zrlist);
注意,第二个参数是通过引用传递的(不是
const
)到
add_variable/add_vector
,其值可能会被
exprtk
更改。您的多线程应用程序失败,因为exprtk不是线程安全的。因此,您无法在多个线程上共享一个对象/表,而不会导致争用和内存损坏。