Skip to content
Josh Blum edited this page Sep 8, 2017 · 6 revisions

table of contents

What is Pothos?

The world is dataflow.

The lens of dataflow provides a unique perspective on data processing applications in many fields, from control systems to image processing to genetic analysis. Many common computer science problems traditionally approached using traditional methods can be effectively attacked from a dataflow perspective.

Pothos is a dataflow processing platform (not a dataflow language in the traditional sense) that aims to provide platform-agnostic, widely distributed stream- and message-based data manipulation in a user-friendly way, with an intuitive GUI interface that exposes the full breadth of the platform and bindings to familiar programming languages. Pothos handles concurrency using the actor model and is capable of distributing processing to a wide variety of networked nodes. The domain between stream-based and message-based data is handled intuitively, and the same API applies largely to both.

In short, Pothos is a good way to process lots of data, very quickly, using all the hardware at your disposal.

What can I do with Pothos?

Some applications Pothos would be a good fit for:

  1. Image and video processing
  2. Distributed data aggregation from remote nodes
  3. Control system prototyping or deployment
  4. Signal processing for sensors or RF
  5. Genetic linkage analysis or multiple sequence alignment
  6. Text parsing or analysis on huge datasets
  7. [insert your application here]!

Why is C++11 a dependency?

Coding is easier.

Pothos makes extensive use of the auto keyword and the ranged for loop to keep lines of code short and to the point. This is as much of a benefit to the author as is it to users creating custom blocks in C++.

STL is more complete.

Pothos uses the threads, mutexes, shared pointers, function pointers, bind, etc, that come with C++11. Therefore there is no need to require additional dependencies like boost; these extremely useful features come with the language.

Move semantics.

Move semantics are a new language feature that avoids unnecessary copying. Not only does this subtlety speed up the STL implementation, but Pothos Object and Proxy classes take full advantage of move semantics where possible.

Widely available.

The compilers that work with all major operating systems support C++11 now; Clang, GCC, MSVC. However, the requirement of C++11 does prohibit the use of some older OSs and compilers. Fortunately, as Pothos reaches completion, this will become even less of a problem.

Why is Poco a dependency?

Poco is the C++ swiss army knife/utility kit. C++ doesn't come with an army of built-in libraries like .NET, Java, or Python. So for this we use Poco:

  • Poco is easy to build and install
  • The API is clean and easy to understand
  • Poco has an extremely nice logging API
  • We also use Poco for:
    • Command line parser
    • Config file parser
    • JSON de/serialization
    • URI parser/formatter
    • Socket and IPv6 support
    • Macros to identify OS and compiler
    • Cross platform module library loader
    • Cross platform sub-process launcher

Look at what else Poco can do: http://pocoproject.org/documentation/

What's so special about Pothos?

Pothos is just another data flow scheduler in an ecosystem of many. So why bother with Pothos? What does Pothos have that others don't?

The Object/Proxy system

The Object/Proxy system enables the Pothos framework to deal with Objects in a programmatic way that enables the crossing of network and even programming language boundaries appear seamless. A user's IP is compiled into a module and installed on the target system: Its immediately available for remote access, immediately available in any language supported by the bindings.

Scheduler direct memory access

Pothos is very flexible about where scheduler memory comes from and how it is used. This flexibility enables the integration of DMA devices such as graphics cards, PCIe, memory mapped device nodes -- without incurring additional memory copying overhead.

In addition, non-mutating blocks can be made that simply move the data from an input to an output without copying it. This enables for example, lightweight decision-based routing blocks, or blocks that seamlessly move data between messaging and stream domains.

Feature complete GUI

Every feature that is available in the API, should be present in the GUI. The GUI is a complete design tool, for creating custom IP blocks, for designing and deploying topologies, and for monitoring, measuring, and calibrating designs. For example: Sit at your "big" computer and deploy all or part of your design to an embedded arm board and measure the performance.

Friendly licensing

The Pothos framework is released under the a very permissive license (BSL 1.0). We don't want to restrict anyone from using Pothos in any way. Users have complete freedom to license their blocks and designs as they see fit.