【发布时间】:2011-05-09 17:37:21
【问题描述】:
你好, 我想评估一个数学函数(用户定义),它在 C++ 中返回一个数组中的几个值(这个函数是一个基于向量的函数 f:R^n->R^m,具有 n 个输入坐标和 m 个输出函数)在 C++ 中参数,例如:
double *my_func(const mxArray *point)
{
double *dat = mxGetPr(point);
double *vals = new double[ 3 ];
vals[0] = dat[0]*dat[0]*dat[0]*dat[0]*dat[0];
vals[1] = sin(dat[0])*dat[1]*dat[2]*dat[2]*cos(dat[1]);
vals[2] = exp(dat[0])*sin(dat[0])*dat[3];
double *pnt = vals;
return pnt;
}
目前我在 CPU 上执行此操作。所以我调用了一次函数并返回一个包含所有函数值的数组。因为我现在想在 GPU 上并行化它,所以我考虑了如何去做。
我认为在每个线程中完全评估 my_func() 会有点愚蠢,因为每个线程都会计算整个函数数组。 这是正确的假设吗?
是否有任何方法可以轻松地仅计算函数数组的第 n 个元素并返回它,以便 5 个线程可以轻松地并行计算函数数组,而不是一个 CPU 完全“单独”计算它?
我能想到的唯一方法是:
double my_func0(const mxArray *point)
{
double *dat = mxGetPr(point);
return dat[0]*dat[0]*dat[0]*dat[0]*dat[0];
}
double my_func1(const mxArray *point)
{
double *dat = mxGetPr(point);
return sin(dat[0])*dat[1]*dat[2]*dat[2]*cos(dat[1]);
}
double my_func2(const mxArray *point)
{
double *dat = mxGetPr(point);
return exp(dat[0])*sin(dat[0])*dat[3];
}
etc... 但这对于以后使用该程序的用户来说是相当“不舒服”的,因为如果他想扩展函数数组而不是仅仅适应一个单一的 C++,他总是必须创建新的 C++ 函数-功能。另一个问题是:我必须动态调用函数,因为函数的数量是“动态的”,因此我必须调用 my_func_%%i%% 并且不知道这是否是一个好方法...所以问题是是否有更好的方法来处理这个问题?
【问题讨论】: