我的库中有函数计算N(N = 500到2000)显式相当简单的操作,但是主软件调用了数十万次。每个小的计算都是独立于其他的,并且每个小计算略有不同(多项式系数,有时其他附加特征也不同),因此没有进行循环,但是这些情况被硬编码到函数中。
不幸的是,主软件中的调用(循环)无法进行线程化,因为在实际调用此特定函数之前,代码不是线程安全的。 (更大的软件包来处理这里......)
我已经测试过在这个函数的开头创建一个openmp线程组并执行例如通过openmp中的section功能划分了4个块,但似乎线程创建#pragma omp parallel的开销太高了(可以吗?)
任何好的想法如何加速这种情况?也许应用SIMD功能,但是当我没有明确的循环来处理时,它会怎样?
#include "needed.h"
void eval_func (const double x, const double y, const double * __restrict__ z, double * __restrict__ out1, double * __restrict__ out2) {
double logx = log(x);
double tmp1;
double tmp2;
//calculation 1
tmp1 = exp(3.6 + 2.7 * logx - (3.1e+03 / x));
out1[0] = z[6] * z[5] * tmp1;
if (x <= 1.0) {
tmp2 = (-4.1 + 9.2e-01 * logx + x * (-3.3e-03 + x * (2.95e-06 + x * (-1.4e-09 + 3.2e-13 * x))) - 8.8e+02 / x);
} else {
tmp2 = (2.71e+00 + -3.3e-01 * logx + x * (3.4e-04 + x * (-6.8e-08 + x * (8.7e-12 + -4.2e-16 * x))) - 1.0e+03 / x);
}
tmp2 = 1.3 * exp(tmp2);
out2[0] = z[3] * z[7] * tmp1 / tmp2;
//calculation 2
.
.
out1[1] = ...
out2[1] = ...
//calculation N
.
.
out1[N-1] = ...
out2[N-1] = ...