easyLambda —— 现代化 C++ 并行数据处理
easyLambda 是使用
easyLambda 也称为 ezl,项目最初目的是为了提供一个用 C++ 处理数据的标准方法。
设计目的:可组合,界面简单,解耦IO,数据格式,从算术逻辑并行代码,更少的样板代码,任何会 C 语言的人都可以理解使用。easyLambda 也达到了这些目的,还包括类型安全数据流管道,map/reduce 等等类似的操作,MPI 并行,一个简单且强大的ExpressionBuilder 接口,支持现代化 C++ 特性。
ezl 可以帮你完成数据处理任务,编写 post-processors 模拟结果,机器学习算法迭代,常规列表数据处理或者任意 数据/任务 并行代码。ezl 可以结合 openCV/Dlib/thrust 等库一起使用。
要求:
- c++14 compliant compiler and MPI (mpic++/mpicxx and mpirun)
- Works with gcc-5.1 or later and clang-3.5 or later.
- Tested with gcc-5.3, gcc-6.0(dev. branch), Apple LLVM version 7.0.0 (clang-700.0.72).
- boost::mpi, boost::serialization tested with 5.8 and 6.0.
并行化:
数据流:
Example wordcount
#include <string>
#include <boost/mpi.hpp>
#include "ezl/ezl.hpp"
#include "ezl/algorithms/readFile.hpp"
#include "ezl/algorithms/reduces.hpp"
int main(int argc, char* argv[]) {
using std::string;
using ezl::readFile;
boost::mpi::environment env(argc, argv);
ezl::rise(readFile<string>(argv[1]).rowSeparator('s').colSeparator(""))
.reduce<1>(ezl::count(), 0).dump()
.run();
return 0;
}
Example pi (Monte-Carlo)
ezl::rise(ezl::kick(10000)) // 10000 trials in total
.map([] {
auto x = rand01();
auto y = rand01();
return x*x + y*y;
})
.filter(ezl::lt(1.))
.reduce(ezl::count(), 0)
.map([](int inCircleCount) {
return (4.0 * inCircleCount / 10000);
}).colsTransform().dump()
.run();
easyLambda 遵循 Boost Software License 协议。
GitHub 地址:https://github.com/haptork/easylambda
发表回复