当前位置: 首页 > news >正文

FastFlow(5)---软件加速器 software accelerator

FastFlow可以用来对顺序执行的代码进行加速而不需要整体重构程序架构。程序员本人需要识别那些需要加速执行。

FastFlow加速概念设计图如下, 

下面是一个并行计算立方x3的例子,

#include <vector>
#include <ff/farm.hpp>

#include <iostream>
using namespace ff;

struct Worker : ff_node_t<long> {
    long *svc(long *task) {
        *task = pow(*task, 3);
        return task;
    }
};

int main(int argc, char *argv[]) {
    assert(argc > 2);
    int nworkers = atoi(argv[1]);
    int streamlen = atoi(argv[2]);

    std::vector<std::unique_ptr<ff_node> > Workers;
    for (int i = 0; i < nworkers; ++i)
        Workers.push_back(make_unique<Worker>());

    ff_Farm<long> farm(std::move(Workers),true); // turn on the accelerator mode
    if (farm.run_then_freeze() < 0) error("running farm");  //run the accelerator asynchronously

    long *result = nullptr;
    for (long i = 0; i < streamlen; i++){
        long *task = new long(i);
        farm.offload(task);  //offload the computing onto the farm

        for (volatile long k = 0; k < 10000; ++k); //do something smart here, reserved

        if (farm.load_result_nb(result)) {
            std::cerr << "[inside for loop] result= " << *result << "\n";
            delete result;
        }
    }
    farm.offload(EOS); //sending the End of Stream

#if 1
    while(farm.load_result(result)){
        std::cerr << "[outside for loop] result = " << *result << "\n";
        delete result;
    }
#else
    do{
        if (farm.load_result_nb(result)){
            if (result == EOS) break;
            std::cerr << "[outside for loop] result = " << *result << "\n";
            delete result;
        }
    }while (1)
#endif
    farm.wait();  //wait for termination
    return 0;
}

运行结果:

相关文章:

  • 华为OD:0019-0020:-最小步骤数—删除字符串中出现次数最少的字符
  • Python学生成绩管信息理系统(面向对象)(学生信息篇)
  • 国稻种芯百团计划行动 丰收节贸促会·袁隆平:水稻国际竞争
  • 面试精选:3、史上最详细的Linux精选面试题(二)
  • 2.21 haas506 2.0开发教程 - TTS - Text To Speech (320开发板)
  • Promethues-如何监控容器
  • 测试人生 | 从小团队的业务到独角兽的测开,涨薪超过60%,90后小哥哥凤凰涅槃了
  • 技术门槛高?来看 Intel 机密计算技术在龙蜥社区的实践
  • 532. 数组中的 k-diff 数对
  • 通过mybatis自定义参数类型转换器,进行数据库字段加密脱敏
  • Win10修复IPv6优先访问
  • 盘点市面上七款好用的代码加密混淆工具,你都用过哪款?
  • STC15单片机-按键检测单击或长按(外部中断)
  • 卷积神经网络工作原理图,图卷积神经网络原理
  • 猿创征文 |【C++】C向C++知识的过度(下)
  • 分享的文章《人生如棋》
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS实用技巧
  • HashMap ConcurrentHashMap
  • JavaScript对象详解
  • magento 货币换算
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • React-flux杂记
  • Sequelize 中文文档 v4 - Getting started - 入门
  • uni-app项目数字滚动
  • VUE es6技巧写法(持续更新中~~~)
  • vue的全局变量和全局拦截请求器
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 彻底搞懂浏览器Event-loop
  • 高度不固定时垂直居中
  • 基于Android乐音识别(2)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何使用 JavaScript 解析 URL
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 正则表达式小结
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #1015 : KMP算法
  • #stm32整理(一)flash读写
  • #宝哥教你#查看jquery绑定的事件函数
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (阿里云万网)-域名注册购买实名流程
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm码农论坛 毕业设计 231126
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ?.的用法
  • @ModelAttribute注解使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)