"In this article we'll get a brief introduction to the J programming language.
The goal is to wet your appetite for an exciting programming paradigm
rather than providing an in-depth introduction. As we move along we'll
learn just enough J to explore a fascinating corner of the language that
lets us manipulate functions as data. You'll see how these techniques
differ from traditional functional programming, why manipulating
functions is interesting and how it lets you solve real problems with a
minimum of code."
http://www.adamtornhill.com/articles/jlang/beyondfunctional.html
Where the chairs are arranged with exquisite precision, and the rosin bag is always full. Or perhaps (yet) another attempt to keep track of those things of which we think we need to keep track.
Wednesday, August 2, 2017
Monday, June 12, 2017
Tagsistant
"Tagsistant is a semantic file system for Linux, a personal tool
to catalog files using tags (labels, mnemonic informations)
rather than directories.
Tagsistant replace the concept of directory with that of tag, but since it have to do with directories, it pairs the concept of tag with that of directory. So within Tagsistant a tag is a directory and a directory is a tag.
To be more precise, this is not true with all the directories. First level directories are special. The one called
Another, called
Another special first level directory is
https://github.com/StrumentiResistenti/Tagsistant
Tagsistant replace the concept of directory with that of tag, but since it have to do with directories, it pairs the concept of tag with that of directory. So within Tagsistant a tag is a directory and a directory is a tag.
To be more precise, this is not true with all the directories. First level directories are special. The one called
tags/ hosts
all the tags. This means that every directory created inside it
is infact a tag.Another, called
store/, hosts contents, like files. All the tags
created inside tags/ are available inside store/. To tag a file
all you have to do is to copy it inside one or more directories
under store/.Another special first level directory is
relations/. Inside it
you can establish relations between tags using mkdir."https://github.com/StrumentiResistenti/Tagsistant
Sultan
"Sultan is a Python package for interfacing with command-line utilities, like
yum, apt-get, or ls, in a Pythonic manner. It lets you run command-line
utilities using simple function calls.
Sultan allows you to interface with command-line utilities from Python without having to write your scripts in Bash.
Sultan was designed because Bash just does not scale well with most projects. As much as we can try, Bash does not have a proper package management system. So, we’re left with script files that are sourced, and called, but it gets quiet complicated as soon as you have more than 10 scripts.
Python has a great package and module system that allows us to create complex projects using the Python language, but also leverage a lot of great tools and functionality that we’ve grown to love and expect from Bash."
https://sultan.readthedocs.io/en/latest/
Sultan allows you to interface with command-line utilities from Python without having to write your scripts in Bash.
Sultan was designed because Bash just does not scale well with most projects. As much as we can try, Bash does not have a proper package management system. So, we’re left with script files that are sourced, and called, but it gets quiet complicated as soon as you have more than 10 scripts.
Python has a great package and module system that allows us to create complex projects using the Python language, but also leverage a lot of great tools and functionality that we’ve grown to love and expect from Bash."
https://sultan.readthedocs.io/en/latest/
Wednesday, June 7, 2017
IRPF90
"IRPF90 is a Fortran90 preprocessor written in Python for programming
using the Implicit Reference to Parameters (IRP) method. It simplifies
the development of large fortran codes in the field of scientific high
performance computing.
IRPF90 is a Fortran programming environment which helps the development of large Fortran codes by applying the Implicit Reference to Parameters method (IRP).
In Fortran programs, the programmer has to focus on the order of the instructions: before using a variable, the programmer has to be sure that it has already been computed in all possible situations. For large codes, it is common source of error.
In IRPF90 most of the order of instructions is handled by the pre-processor, and an automatic mechanism guarantees that every entity is built before being used. This mechanism relies on the {needs/needed by} relations between the entities, which are built automatically.
Codes written with IRPF90 execute often faster than Fortran programs, are faster to write and easier to maintain."
https://github.com/scemama/irpf90
http://irpf90.ups-tlse.fr/index.php?title=IRPF90
https://scemama.gitbooks.io/irpf90/
IRPF90 is a Fortran programming environment which helps the development of large Fortran codes by applying the Implicit Reference to Parameters method (IRP).
In Fortran programs, the programmer has to focus on the order of the instructions: before using a variable, the programmer has to be sure that it has already been computed in all possible situations. For large codes, it is common source of error.
In IRPF90 most of the order of instructions is handled by the pre-processor, and an automatic mechanism guarantees that every entity is built before being used. This mechanism relies on the {needs/needed by} relations between the entities, which are built automatically.
Codes written with IRPF90 execute often faster than Fortran programs, are faster to write and easier to maintain."
https://github.com/scemama/irpf90
http://irpf90.ups-tlse.fr/index.php?title=IRPF90
https://scemama.gitbooks.io/irpf90/
CFortranTranslator
"A translator from Fortran90/Fortran77(ISO/IEC 1539:1991) to C++.
Fortran is an efficient tool in scientific calculation. However sometimes translating old fortran codes to C++ will enable more programming abstraction, better GUI framework support, higher performance IDE and easier interaction.
This translator is not intended to improve existing codes, but to make convenience for those who need features of C++ and remain fortran traits as much as possible."
https://github.com/CalvinNeo/CFortranTranslator
Fortran is an efficient tool in scientific calculation. However sometimes translating old fortran codes to C++ will enable more programming abstraction, better GUI framework support, higher performance IDE and easier interaction.
This translator is not intended to improve existing codes, but to make convenience for those who need features of C++ and remain fortran traits as much as possible."
https://github.com/CalvinNeo/CFortranTranslator
BLIS
"BLIS is a portable software framework for instantiating high-performance
BLAS-like dense linear algebra libraries. The framework was designed to isolate
essential kernels of computation that, when optimized, immediately enable
optimized implementations of most of its commonly used and computationally
intensive operations. BLIS is written in ISO
C99 and available under a
new/modified/3-clause BSD
license. While BLIS exports a
new BLAS-like API,
it also includes a BLAS compatibility layer which gives application developers
access to BLIS implementations via traditional BLAS routine
calls.
For a thorough presentation of our framework, please read our recently accepted journal article, "BLIS: A Framework for Rapidly Instantiating BLAS Functionality". For those who just want an executive summary, please see the next section.
In a follow-up article, "The BLIS Framework: Experiments in Portability", we investigate using BLIS to instantiate level-3 BLAS implementations on a variety of general-purpose, low-power, and multicore architectures.
An IPDPS'14 conference paper titled "Anatomy of High-Performance Many-Threaded Matrix Multiplication" systematically explores the opportunities for parallelism within the five loops that BLIS exposes in its matrix multiplication algorithm.
It is our belief that BLIS offers substantial benefits in productivity when compared to conventional approaches to developing BLAS libraries, as well as a much-needed refinement of the BLAS interface, and thus constitutes a major advance in dense linear algebra computation. While BLIS remains a work-in-progress, we are excited to continue its development and further cultivate its use within the community.
BLIS offers several advantages over traditional BLAS libraries:
For a thorough presentation of our framework, please read our recently accepted journal article, "BLIS: A Framework for Rapidly Instantiating BLAS Functionality". For those who just want an executive summary, please see the next section.
In a follow-up article, "The BLIS Framework: Experiments in Portability", we investigate using BLIS to instantiate level-3 BLAS implementations on a variety of general-purpose, low-power, and multicore architectures.
An IPDPS'14 conference paper titled "Anatomy of High-Performance Many-Threaded Matrix Multiplication" systematically explores the opportunities for parallelism within the five loops that BLIS exposes in its matrix multiplication algorithm.
It is our belief that BLIS offers substantial benefits in productivity when compared to conventional approaches to developing BLAS libraries, as well as a much-needed refinement of the BLAS interface, and thus constitutes a major advance in dense linear algebra computation. While BLIS remains a work-in-progress, we are excited to continue its development and further cultivate its use within the community.
BLIS offers several advantages over traditional BLAS libraries:
-
Portability that doesn't impede high performance. Portability was a top
priority of ours when creating BLIS. With zero additional effort on the part of
the developer, BLIS is configurable as a fully-functional reference
implementation. But more importantly, the framework identifies and isolates a
key set of computational kernels which, when optimized, immediately and
automatically optimize performance across virtually all level-2 and level-3
BLIS operations. In this way, the framework acts as a productivity multiplier.
And since the optimized (non-portable) code is compartmentalized within these
few kernels, instantiating a high-performance BLIS library on a new
architecture is a relatively straightforward endeavor.
-
Generalized matrix storage. The BLIS framework exports interfaces that
allow one to specify both the row stride and column stride of a matrix. This
allows one to compute with matrices stored in column-major order, row-major
order, or by general stride. (This latter storage format is important for those
seeking to implement tensor contractions on multidimensional arrays.)
Furthermore, since BLIS tracks stride information for each matrix, operands of
different storage formats can be used within the same operation invocation. By
contrast, BLAS requires column-major storage. And while the CBLAS interface
supports row-major storage, it does not allow mixing storage formats.
-
Full support for the complex domain. BLIS operations are developed and
expressed in their most general form, which is typically in the complex domain.
These formulations then simplify elegantly down to the real domain, with
conjugations becoming no-ops. Unlike the BLAS, all input operands in BLIS that
allow transposition and conjugate-transposition also support conjugation
(without transposition), which obviates the need for thread-unsafe workarounds.
Also, where applicable, both complex symmetric and complex Hermitian forms are
supported. (BLAS omits some complex symmetric operations, such as
symv,syr, andsyr2.)
-
Advanced multithreading support. BLIS allows multiple levels of
symmetric multithreading for nearly all level-3 operations. (Currently, users
may choose to obtain parallelism via either OpenMP or POSIX threads). This
means that matrices may be partitioned in multiple dimensions simultaneously to
attain scalable, high-performance parallelism on multicore and many-core
architectures. The key to this innovation is a thread-specific control tree
infrastructure which encodes information about the logical thread topology and
allows threads to query and communicate data amongst one another. BLIS also
employs so-called "quadratic partitioning" when computing dimension sub-ranges
for each thread, so that arbitrary diagonal offsets of structured matrices with
unreferenced regions are taken into account to achieve proper load balance.
-
Ease of use. The BLIS framework, and the library of routines it
generates, are easy to use for end users, experts, and vendors alike. An
optional BLAS compatibility layer provides application developers with
backwards compatibility to existing BLAS-dependent codes. Or, one may adjust or
write their application to take advantage of new BLIS functionality (such as
generalized storage formats or additional complex operations) by calling BLIS
directly. BLIS's interfaces will feel familiar to many veterans of BLAS since
BLIS exports APIs with BLAS-like calling sequences. And experts will find
BLIS's internal object-based APIs a delight to use when customizing or writing
their own BLIS operations. (Objects are relatively lightweight
structsand passed by address, which helps tame function calling overhead.)
-
Multilayered API and exposed kernels. The BLIS framework exposes its
implementations in various layers, allowing expert developers to access exactly
the functionality desired. This layered interface includes that of the
lowest-level kernels, for those who wish to bypass the bulk of the framework.
Optimizations can occur at various levels, in part thanks to exposed packing
and unpacking facilities, which by default are highly parameterized and
flexible.
-
Functionality that grows with the community's needs. As its name
suggests, the BLIS framework is not a single library or static API, but rather
a nearly-complete template for instantiating high-performance BLAS-like
libraries. Furthermore, the framework is extensible, allowing developers to
leverage existing components to support new operations as they are identified.
If such operations require new kernels for optimal efficiency, the framework
and its APIs will be adjusted and extended accordingly.
-
Code re-use. Auto-generation approaches to achieving the aforementioned
goals tend to quickly lead to code bloat due to the multiple dimensions of
variation supported: operation (i.e.
gemm,herk,trmm, etc.); parameter case (i.e. side, [conjugate-]transposition, upper/lower storage, unit/non-unit diagonal); datatype (i.e. single-/double-precision real/complex); matrix storage (i.e. row-major, column-major, generalized); and algorithm (i.e. partitioning path and kernel shape). These "brute force" approaches often consider and optimize each operation or case combination in isolation, which is less than ideal when the goal is to provide entire libraries. BLIS was designed to be a complete framework for implementing basic linear algebra operations, but supporting this vast amount of functionality in a manageable way required a holistic design that employed careful abstractions, layering, and recycling of generic (highly parameterized) codes, subject to the constraint that high performance remain attainable.
- A foundation for mixed domain and/or mixed precision operations. BLIS was designed with the hope of one day allowing computation on real and complex operands within the same operation. Similarly, we wanted to allow mixing operands' floating-point precisions, or both domain and precision. Unfortunately, this feature results in a significant amount of additional code, mostly in level-2 and lower operations, thus, it is disabled by default. However, mixing domains in level-3 operations is possible, in theory, with almost no additional effort on the part of the library developer, and such operations would remain capable of high performance. (Please note that this functionality is still highly experimental and should be thought of as a feature that will be more thoroughly implemented at some future date.)
PyCall.jl
"This package provides the ability to directly call and fully
interoperate with Python from the Julia
language. You can import arbitrary Python
modules from Julia, call Python functions (with automatic conversion
of types between Julia and Python), define Python classes from Julia
methods, and share large data structures between Julia and Python
without copying them."
https://github.com/JuliaPy/PyCall.jl
https://github.com/JuliaPy/PyCall.jl
Subscribe to:
Posts (Atom)