首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:评估自己的数学函数(像多维分析那样的函数数组)

C++:评估自己的数学函数(像多维分析那样的函数数组)
EN

Stack Overflow用户
提问于 2011-05-09 17:37:21
回答 1查看 484关注 0票数 0

嘿,我想在C++中计算一个数学函数(用户定义的),它返回数组中的几个值(这个函数是一个基于向量的函数f:R^n->R^m,具有n个输入坐标和m个输出函数),用于某些参数,例如:

代码语言:javascript
复制
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计算它完全“单独”?

我唯一能想到的方法是:

代码语言:javascript
复制
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];
}

等等。但对于后来使用该程序的用户来说,这将是相当“不舒服”的,因为如果他想要扩展函数数组,而不是仅仅使用一个C++函数,他总是必须创建新的C++函数。还有一个问题是:我必须动态调用函数,因为函数的数量是“动态的”,因此我必须调用my_func_%%i%%,而不知道这是否是一个很好的方法。所以问题是,是否有更好的方法来处理这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-09 18:32:47

当你说"user_defined“时,我想你的意思是别人写了my_func(),然后你的代码调用了它?

如果是这样的话,请考虑并行运行多个对my_func()的调用,而不是试图中断函数。这意味着编写my_func()的人只需要编写一个函数,您将负责委派多个调用,确保他们有正确的数据可供处理,并收集结果。

基于注释的更新

在您的情况下,如果计算vals每个成员所需的操作是不同的,那么用户将不得不根据所需的索引来参数化my_func();正如您建议的double my_func(const mxArray *point, const unsigned & index),请注意它现在是如何返回单个双值的,而不是整个结果数组。或为每个索引提供不同的my_func()double my_func_n(const mxArray *point)

然后,您可以从任意多个不同的线程调用这个函数或一组函数,并得到一个进一步计算的结果。然而,我们忽略了许多并发问题,同时读写数据,这些问题都需要考虑。

将军咨询意见

在研究使用GPU进行多任务处理之前,先看看CPU上的标准多线程处理(我建议Boost Thread库帮助:http://www.boost.org/)。一旦您了解了线程是如何创建和使用的,您可能会发现您更好地理解了您可以使用它们做什么,以及如何处理它们。

如果将数学函数应用于非常大的矩阵或向量,并且可以使用某些图形函数的硬件实现来实现数学结果,则使用GPU进行多任务处理变得更加有用。还有更多的库来支持GPGPU (通用GPU)编程,如OpenCL、Nvidia的CUDA或ATI的流。看看这些库提供了什么,让您了解它们如何适用于您的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5940453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档