FastFlow介绍与farm模式例子的编写

news/2024/5/5 1:35:01/文章来源:https://blog.csdn.net/zkmrobot/article/details/126642167

软件简介

FastFlow 是一个多核编程框架,实现了无锁的 MPMC FIFO 队列规范,用以支持多核的高级应用开发。速度比 TBB、OpenMP 都要快。

 主页:

https://github.com/fastflow/fastflow

Farm模式的编写:

1.基本Farm模式编写

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

using namespace ff;

struct Worker : ff_node {
    void *svc(void *t) {
        std::cout << "Hello I am the worker " << get_my_id() << "\n";
        return t;
    }
};

int main(int argc, char* argv[]) {
    assert(argc > 1);
    int nworkers = atoi(argv[1]);
    std::vector<ff_node *> Workers;
    for (int i = 0; i < nworkers; ++i) Workers.push_back(new Worker);
    ff_farm<> myFarm(Workers);
    if (myFarm.run_and_wait_end() < 0) error("running myFarm");
    return 0;
}

运行结果:

2. Pipeline+Farm模式

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

using namespace ff;

struct Worker : ff_node_t<long> {
    int svc_init(){
        std::cout << "Hello I am the worker " << get_my_id() << "\n";
        return 0;
    }
    long *svc(long *t) {
        return t;
    }
};

struct firstStage : ff_node_t<long> {
    long size = 10;
    long *svc(long*) {
        for (long i = 0; i< size; ++i)
            ff_send_out(new long(i));
        return EOS;
    }
} streamGenerator;

struct lastStage : ff_node_t<long> {
    long *svc(long *t) {
        const long &task = *t;
        std::cout << "Last stage received " << task << "\n";
        delete t;
        return GO_ON;
    }
} streamDrainer;

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

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

    ff_Pipe<> pipe(streamGenerator, myFarm, streamDrainer);

    if (pipe.run_and_wait_end() < 0) error("running pipe");

    return 0;
}

运行结果:

3. 用单个函数而不是ff_node来创建task-farm

例子如下:

#include <ff/farm.hpp>

using namespace ff;

struct myTask{....};

myTask * F(myTask *in, ff_node* const node) {...}

ff_Farm<> farm(F, 3); //create a farm executing 3 replicas of F

4. 在Farm中重定义Emitter与Collector

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

using namespace ff;

struct Worker : ff_node_t<long> {
    int svc_init(){
        std::cout << "Hello I am the worker " << get_my_id() << "\n";
        return 0;
    }
    long *svc(long *t) {
        return t;
    }
};

struct firstStage : ff_node_t<long> {
    long size = 10;
    long *svc(long*) {
        for (long i = 0; i< size; ++i)
            ff_send_out(new long(i));
        return EOS;
    }
} Emitter;

struct lastStage : ff_node_t<long> {
    long *svc(long *t) {
        const long &task = *t;
        std::cout << "Last stage received " << task << "\n";
        delete t;
        return GO_ON;
    }
} Collector;

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

    ff_Farm<long> farm([nworkers]() {
        std::vector<std::unique_ptr<ff_node> > Workers;
        for (int i = 0; i < nworkers; ++i) 
            Workers.push_back(make_unique<Worker>());
        return Workers;
    } (), Emitter, Collector);

    if (farm.run_and_wait_end() < 0) error("running farm");

    return 0;
}

运行结果:

5. 没有的Collector的Farm

调用remove_collector将Farm中的搜集器删除

 

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

using namespace ff;

struct Worker : ff_node_t<long> {
    int svc_init(){
        std::cout << "Hello I am the worker " << get_my_id() << "\n";
        return 0;
    }
    long *svc(long *t) {
        return t;
    }
};

struct firstStage : ff_node_t<long> {
    long size = 10;
    long *svc(long*) {
        for (long i = 0; i< size; ++i)
            ff_send_out(new long(i));
        return EOS;
    }
} Emitter;

struct lastStage : ff_minode_t<long> {  //Note: multi-input node
    long *svc(long *t) {
        const long &task = *t;
        std::cout << "Last stage received " << task 
            << " from " << get_channel_id() << "\n";
        delete t;
        return GO_ON;
    }
} LastStage;

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

    ff_Farm<long> farm([nworkers]() {
        std::vector<std::unique_ptr<ff_node> > Workers;
        for (int i = 0; i < nworkers; ++i)
            Workers.push_back(make_unique<Worker>());
        return Workers;
    } (), Emitter);

    farm.remove_collector();
    ff_Pipe<> pipe(farm, LastStage);

    if (pipe.run_and_wait_end() < 0) error("running pipe");

    return 0;
}

运行结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_4421.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐系统-Hive基础

Hive基本操作基本概念功能说明架构hive和hadoop数据模型安装部署安装启动基本操作hive的内部表和外部表分区表动态分区Hive函数Hive内置运算符和内置函数Hive自定义函数综合案例基本概念 功能说明 操作接口采用类SQL法&#xff0c;提供快速开发的能力避免了去写MapReduce&…

通信原理 | 基本概念:信源、信道、噪声、信宿等

一、通信的基本概念 1. 信源 通信中产生和发送信息的一端叫做信源 2. 信宿 通信中接收信息的一端叫做信宿 3. 信道 信号在信源和信宿之间传输的通道叫做信道(主要分为有线信道和无线信道) 4. 噪声 信息在传输过程中可能受到外界干扰&#xff0c;把这种干扰成为噪声 5.…

关于Flask高级_RequestParser中的add_argument方法参数详解

Flask高级_RequestParser中的add_argument方法参数详解 一.参数介绍 default&#xff1a;默认值&#xff0c;如果这个参数没有值&#xff0c;那么将使用这个参数 指定的默认值。 required&#xff1a;是否必须。默认为False&#xff0c;如果设置为True&#xff0c;那么这 个参…

msf后渗透之文件交互指令、上传下载文件、屏幕截图、键盘记录、创建账户、音频录像和提权(上)

目录 1、文件交互指令 2、上传下载文件(windows) 3、屏幕截图(windows) 4、键盘记录&#xff08;windows&#xff09; 1、先启动记录keyscan_start 2、显示键盘输入内容keyscan_dump 3、结束监控keyscan_stop 5、创建账户&#xff08;windows&#xff09; 1、先看下目标…

C语言-手写Map(数组+链表+红黑树)(全功能)

要求 需要准备数组集合(List) 数据结构需要准备单向链表(Linked) 数据结构需要准备红黑树(Rbtree)数据结构需要准备红黑树和链表适配策略(文章内部提供,可以自行参考) 建议先去阅读我博客这篇文章C语言-手写Map(数组链表)(全功能) 有助于理解 hashmap使用红黑树的原因是&…

Java实现的一个编译器源代码(Win11)

本文的源代码摘自编译器龙书《Compilers : principles, techniques, and tools》第二版的附录A“一个完整的前端”&#xff08;A Complete Front End&#xff09;。 上述书中的编译器是在Unix系统中&#xff0c;主体代码与书中相同&#xff0c;只是对字符串处理不同&#xff1…

C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验】

本机环境&#xff1a; OS:WIN11 CUDA: 11.1 CUDNN:8.0.5 显卡&#xff1a;RTX3080 16G opencv:3.3.0 onnxruntime:1.8.1 目前C 调用onnxruntime的示例主要为图像分类网络&#xff0c;与语义分割网络在后处理部分有很大不同。 pytorch模型转为onnx格式 1.1 安装onnx, 参考官网…

Tcp通信

一发一收 Client package tcpDemo;import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {//1.创建Socke通信管道请求服务端的连接//p…

TCP连接管理机制(超级重要)

以下是这篇文章讲解的思维导图,整理完,我也脑瓜子嗡嗡的,怎么这么多,那是因为太重要了,防止面试官把你问死,那就必须去了解,加油啊~~~ 参考 : 小林coding 书籍 : TCP/IP 卷一 网站 : 计算机网络-41-60 | 阿秀的学习笔记 知乎文章 : 看到有人说&#xff0c;只看到过TCP状态位…

【单片机原理及应用】第一篇——单片机概述

个人主页 点击这里 专栏学习 点击这里 目录 内容概要 1.1单片机简介 1.2单片机的发展历史 1.3单片机的特点 1.4单片机的应用 1&#xff0e;工业检测与控制 2&#xff0e;仪器仪表 3&#xff0e;消费类电子产品 4&#xff0e;通讯 5&#xff0e;武器装备 6.各种终…

python从入门到实践:数据类型、文件处理

目录 一、数据类型 1.数字 整型与浮点型 其他数字类型 2.字符串 3.字节串 4.列表 5.元祖 6.集合 7.字典 8.可变类型与不可变类型 数字类型 字符串 列表 元祖 字典 9.数据类型总结 二、文件处理 1.文件的引入 2.文件的基本操作流程 2.1基本流程 2.2资源回…

【Java 基础】7、学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程

&#x1f4b0; 写了一段时间的 Java 程序&#xff0c;SpringBoot &#x1f343;项目也做了好几个&#xff0c;但感觉自己对 Java 的了解还是特别少&#xff0c;所以决定从零&#x1f37c;开始重新学习&#xff0c;下面是学习的笔记。【学习素材&#xff1a;韩顺平老师】 &#…

docker 安装 elasticsearch

一、安装docker Docker 的安装_傲傲娇的博客-CSDN博客 二、配置es挂载文件和目录 mkdir -p /opt/elasticsearch/{config,data,plugins} chmod 777 /opt/elasticsearch/data 在config目录下创建elasticsearch.yml配置文件 cluster.name: elasticsearch-cluster # 节点名称 n…

【MC教程】iPad启动Java版mc(无需越狱)(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher

【MC教程】iPad启动Java版mc&#xff08;无需越狱&#xff09;(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher 文章目录【MC教程】iPad启动Java版mc&#xff08;无需越狱&#xff09;(保姆级?) Jitterbug启动iOS我的世界Java版启动器 PojavLauncher前言iSign…

springmvc实现文件上传书本管理CRUD

今天小编给大家分享文件上传&#xff0c;和对书本管理进行新增、修改、删除、查询。 效果展示 首页 新增 修改 一、书本管理CRUD 1.开发前必做的配置 1.1 导入pom.xml文件依赖 实现CRUDspringmvc的jar包 <dependency><groupId>org.springframework</groupId…

3.实现redis哨兵,模拟master故障场景

3.实现redis哨兵,模拟master故障场景 实验拓扑图 3.1 哨兵的准备实现主从复制架构 哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用redis架构。 注意: master 的配置文件中的masterauth 和slave的都必须相同 所有主从节点的redis…

小波神经网络的基本原理,小波神经网络功能分析

小波神经网络的优势是什么&#xff1f;谢谢 小波神经网络相比于前向的神经网络,它有明显的优点:首先小波神经网络的基元和整个结构是依据小波分析理论确定的,可以避免BP神经网络等结构设计上的盲目性;其次小波神经网络有更强的学习能力,精度更高。 总的而言&#xff0c;对同样…

数据结构初步(一)- 时间与空间复杂度

目录前言1. 数据结构与算法1.1 数据结构是啥1.2 算法是啥2. 算法效率2.1 如何衡量一个算法的效率2.2 算法的复杂度3. 时间复杂度3.1 概念3.2 大O的渐进表示法3.3 例子分析计算Func2的时间复杂度计算Func3的时间复杂度计算Func4的时间复杂度计算strchr的时间复杂度计算冒泡排序的…

端口号被占用解决办法(超详细)

文章目录问题描述java.net.BindException: Address already in use: JVM_BindWeb server failed to start. Port 8899 was already in use.解决方案问题描述 java.net.BindException: Address already in use: JVM_Bind Web server failed to start. Port 8899 was already in…

极几何,本质矩阵,基础矩阵,单应矩阵

什么是三角化&#xff1f; 三角化就是下图的红字部分&#xff1a; 什么是极几何&#xff1f; 极几何描述了同一场景或者物体在两个视点图像间的对应关系。 下图中的O1和O2分别是两个相机的光心&#xff0c;即摄像机坐标系的原点。由下图可知给定了一个三维空间下的P点&…