将多个函数调用折叠为单个函数?
Fold multiple function-calls to single function?
我在考虑一个简单的 SIMD 类,它支持重载的算术运算符+-*/
等。
在将其实现为类模板以支持不同类型的内部函数时,我注意到有一些可用的可以同时执行多个操作(_mm_fmadd_ps
用于乘法和加法)。
我现在想知道是否有一种相对理智的方法仍然可以使用数学运算符重载a * b + c -> madd( a , b , c )
而不是使用正常的自由函数add( mul( a , b ) , c ) -> madd( a , b , c )
并使用这些较新的内部函数。
所以我的问题归结为:
- 是否可以链接多个(独立的)函数调用以仅调用一个特定函数(一般问题,与 SIMD 无关)?
- (当代理能够做到这一点时,他们值得吗)?
- 如果没有,那么关于 SIMD 容器的 API 设计以提供正常操作并能够更新内部函数的好方法是什么?
- 同时提供操作员过载和自由功能
- 摒弃操作员过载,仅依靠自由功能
- 是否允许编译器折叠内部函数以在适当的情况下自动使用新内部函数?(当内部函数可用和/或已用于所需版本的内部函数时,
add( mul( a , b ) , c )
折叠以madd( a , b , c )
)
像这样(您可能希望使用最大优化器设置):
#include <iostream>
template<class Intrinsic>
struct optimised
{
using type = Intrinsic;
optimised(type v)
: _v (v)
{}
operator type&() {
return _v;
}
operator const type&() const {
return _v;
}
type _v;
};
// naiive implementation of madd
double madd(double a, double b, double c) {
std::cout << "madd(" << a << ", " << b << ", " << c << ")" << std::endl;
return (a * b) + c;
}
struct mul_result
{
mul_result(const double& a, const double&b)
: _a(a), _b(b)
{}
operator double() const {
return _a * _b;
}
const double &_a, &_b;
};
double operator+(const mul_result& ab, const double& c)
{
return madd(ab._a, ab._b, c);
}
mul_result operator*(const optimised<double>& a, const optimised<double>& b)
{
return mul_result(a, b);
}
using namespace std;
int main()
{
optimised<double> a = 3, b = 7, c = 2;
auto x = a * b + c;
cout << x << endl;
return 0;
}
预期输出:
madd(3, 7, 2)
23
相关文章:
- 如何对具有相同类型的成员使用单个函数 C++.
- 外部 C 和 C++ 对于单个函数(bsearch / qsort)的目的是什么?
- 如何使用 std::cout 或 std::ofstream 作为单个函数的输入?
- C 使用单个函数对具有多种值类型的数组排序
- 在Java中,是否可以编写单个函数或类来处理任意多维ArrayList?
- 具有单个函数的两个点的距离和坡度
- 我可以从 C++17 折表达式中解析出单个函数吗?
- C++ 11/14 根据模板类型在单个函数中执行不同的操作
- 为单个函数同时声明多个变量的最佳方式是什么
- 我可以从C 中的库中包括/导入单个函数吗?
- 将多个函数调用折叠为单个函数?
- 如何命名单个函数参数包
- 从单个函数返回多个变量
- C++:用单个函数调用替换多个索引相等性测试
- 如何更改 10 的颜色 通过 c++ 构建器中的单个函数编辑控件
- Windows中单个C++函数的简单评测
- 如何将单个函数引入当前命名空间
- C++While循环在单个函数调用中重复调用
- 对单个函数进行基准测试
- 只对单个函数/文件启用编译器优化