Commit f2dc8700 by Tobias Fuchs

Merge branch 'development' into embb327_llx_scx

parents 5f3e1399 5abeb065
Embedded Multicore Building Blocks (EMB²) Embedded Multicore Building Blocks (EMB²)
========================================= =========================================
Version 0.2.3 Version 0.3.0
------------- -------------
### Features:
- mtapi_c:
- Implemented action plugin API
- Implemented load balancing for distributed/heterogeneous systems
- Implemented OpenCL action plugin
- Implemented network action plugin
- mtapi_cpp:
- Added support for distributed/heterogeneous systems
### Changes and improvements:
- mtapi_c:
- Added multi-instance task support and test
- Improved notification of worker threads
- mtapi_cpp:
- Moved interface for homogeneous systems to tasks_cpp
- base_cpp:
- Moved tick types to internal namespace and added duration typedefs
- dataflow_cpp:
- Removed spinlocks
- Simplified registration of processes (only sources need to be added)
- Increased number of task queues in unit test
- Added assertion in unit test
- Improved exception handling
- Removed stray include
- Refactored to use tasks_cpp
- algorithms_cpp:
- Restricted partitioners to random access iterators
- Added unit tests for partitioners on large ranges
- Refactored to use tasks_cpp
### Bug fixes: ### Bug fixes:
- Fixed freeing of temporary buffer in MergeSortAllocate - Fixed unit test for dataflow_cpp
- Fixed minor bugs in mtapi_c - Fixed wait-free SPSC queue
- Fixed paths in Doxyfile.in template
### Build system:
- Fixed compilation for newer CMake Versions (>= 3.1)
- Changed task test to avoid Jenkins timeout
- Changed CMakeLists to avoid error if policy is unknown
- Added mtapi_network_c and mtapi_opencl_c to root CMakeLists
- Added tasks_cpp to test scripts / batch file
- Fixed cpplint warnings
### Documentation:
- Extended tutorial and examples regarding support for distributed/heterogeneous systems including plugins and new task interface
- Added Doxygen documentation for mtapi_opencl_c and mtapi_network_c
- Added Doxygen documentation to mtapi_ext.h
- Updated README and removed limitation to homogeneous systems
- Added missing concurrency tags in mtapi_cpp
Version 0.2.3
-------------
### Features:
- None
### Changes and improvements: ### Changes and improvements:
- Changed use of partitioners in ForEach, Reduce, Scan, Count, and MergeSort - Changed use of partitioners in ForEach, Reduce, Scan, Count, and MergeSort
...@@ -21,8 +72,10 @@ Version 0.2.3 ...@@ -21,8 +72,10 @@ Version 0.2.3
- Added tests for Thread::ID (base_cpp), ExecutionPolicy (mtapi_cpp), and error cases in mtapi_c - Added tests for Thread::ID (base_cpp), ExecutionPolicy (mtapi_cpp), and error cases in mtapi_c
- Added tests on empty and negative input ranges in algorithms - Added tests on empty and negative input ranges in algorithms
### Features: ### Bug fixes:
- None - Fixed freeing of temporary buffer in MergeSortAllocate
- Fixed minor bugs in mtapi_c
- Fixed paths in Doxyfile.in template
### Build system: ### Build system:
- Added option to CMake to toggle automatic initialization of MTAPI C++ interface - Added option to CMake to toggle automatic initialization of MTAPI C++ interface
...@@ -43,17 +96,8 @@ Version 0.2.3 ...@@ -43,17 +96,8 @@ Version 0.2.3
Version 0.2.2 Version 0.2.2
------------- -------------
### Bug fixes: ### Features:
- Fixed 64bit problem in atomics - None
- Fixed bug in dataflow_cpp causing network to hang
- Fixed bug in conversion of core_set
- Fixed fetch-and-add implementation to support armv7-a
- Fixed missing freeing of mutex attributes in case of error
- Fixed bug where closure was allocated with Allocation::New but deleted with operator delete
- Fixed inconsistent naming of unit test cases
- Fixed memory allocation in hazard pointer implementation by replacing calls to new and delete with EMB²-specific functions
- Fixed memory leak in tests for containers
- Fixed affinity implementation for FreeBSD
### Changes and improvements: ### Changes and improvements:
- Added checks for memory leaks in tests - Added checks for memory leaks in tests
...@@ -66,8 +110,17 @@ Version 0.2.2 ...@@ -66,8 +110,17 @@ Version 0.2.2
- Added assert in embb_tss_get - Added assert in embb_tss_get
- Moved ExecutionPolicy from algorithms to mtapi_cpp, removed Affinity - Moved ExecutionPolicy from algorithms to mtapi_cpp, removed Affinity
### Features: ### Bug fixes:
- None - Fixed 64bit problem in atomics
- Fixed bug in dataflow_cpp causing network to hang
- Fixed bug in conversion of core_set
- Fixed fetch-and-add implementation to support armv7-a
- Fixed missing freeing of mutex attributes in case of error
- Fixed bug where closure was allocated with Allocation::New but deleted with operator delete
- Fixed inconsistent naming of unit test cases
- Fixed memory allocation in hazard pointer implementation by replacing calls to new and delete with EMB²-specific functions
- Fixed memory leak in tests for containers
- Fixed affinity implementation for FreeBSD
### Build system: ### Build system:
- Removed cppcheck warnings - Removed cppcheck warnings
...@@ -89,14 +142,17 @@ Version 0.2.2 ...@@ -89,14 +142,17 @@ Version 0.2.2
Version 0.2.1 Version 0.2.1
------------- -------------
### Features:
- Added embb_core_count_available() implementation for FreeBSD.
### Changes and improvements:
- None
### Bug fixes: ### Bug fixes:
- Fixed implementation of atomic operations on ARM. - Fixed implementation of atomic operations on ARM.
- Fixed bug in HelpScan routine of hazard pointer implementation. - Fixed bug in HelpScan routine of hazard pointer implementation.
- Replaced inclusion of non-standard header malloc.h with stdlib.h. - Replaced inclusion of non-standard header malloc.h with stdlib.h.
### Features:
- Added embb_core_count_available() implementation for FreeBSD.
### Build system: ### Build system:
- Added initial support for Clang. - Added initial support for Clang.
- Added initial support for Travis. - Added initial support for Travis.
...@@ -111,7 +167,7 @@ Version 0.2.1 ...@@ -111,7 +167,7 @@ Version 0.2.1
### Documentation: ### Documentation:
- Updated README file, created CHANGELOG file, and added markdown support. - Updated README file, created CHANGELOG file, and added markdown support.
- Corrected license in COPYING.md (BSD 2-clause). - Corrected license in COPYING file (BSD 2-clause).
- Changed default Doxygen level for API to two. - Changed default Doxygen level for API to two.
- Added check for Doxyfile.in (if not present, do not add Doxygen target). - Added check for Doxyfile.in (if not present, do not add Doxygen target).
- Added PDF image of building blocks and updated tutorial.tex. - Added PDF image of building blocks and updated tutorial.tex.
......
...@@ -27,8 +27,8 @@ cmake_minimum_required (VERSION 2.8.9) ...@@ -27,8 +27,8 @@ cmake_minimum_required (VERSION 2.8.9)
# Version number # Version number
set (EMBB_BASE_VERSION_MAJOR 0) set (EMBB_BASE_VERSION_MAJOR 0)
set (EMBB_BASE_VERSION_MINOR 2) set (EMBB_BASE_VERSION_MINOR 3)
set (EMBB_BASE_VERSION_PATCH 4) set (EMBB_BASE_VERSION_PATCH 0)
# Fix compilation for CMake versions >= 3.1 # Fix compilation for CMake versions >= 3.1
# #
......
...@@ -154,7 +154,7 @@ class WaitFreeSPSCQueue { ...@@ -154,7 +154,7 @@ class WaitFreeSPSCQueue {
/** /**
* Creates a queue with at least the specified capacity. * Creates a queue with at least the specified capacity.
* *
* \memory Allocates \c 2^k elements of type \c Type, where \k is the * \memory Allocates \c 2^k elements of type \c Type, where \c k is the
* smallest number such that <tt>capacity <= 2^k</tt> holds. * smallest number such that <tt>capacity <= 2^k</tt> holds.
* *
* \notthreadsafe * \notthreadsafe
......
...@@ -290,7 +290,7 @@ QueueTestSingleThreadEnqueueDequeue_ThreadMethod() { ...@@ -290,7 +290,7 @@ QueueTestSingleThreadEnqueueDequeue_ThreadMethod() {
} }
// Oversized amount should not be larger than the original capacity // Oversized amount should not be larger than the original capacity
PT_ASSERT_LT(oversized_count, 2 * n_queue_size); PT_ASSERT_LT(oversized_count, 2 * n_queue_size);
// Dequeue the expected amount of elements // Dequeue the expected amount of elements
for (int i = 0; i != n_queue_size; ++i) { for (int i = 0; i != n_queue_size; ++i) {
element_t dequ(0, -1); element_t dequ(0, -1);
......
...@@ -149,7 +149,7 @@ SimpleTest::SimpleTest() { ...@@ -149,7 +149,7 @@ SimpleTest::SimpleTest() {
void SimpleTest::TestBasic() { void SimpleTest::TestBasic() {
// All available cores // All available cores
embb::base::CoreSet core_set(true); embb::base::CoreSet core_set(true);
int num_cores = core_set.Count(); unsigned int num_cores = core_set.Count();
embb::tasks::Node::Initialize( embb::tasks::Node::Initialize(
MTAPI_DOMAIN_ID, MTAPI_DOMAIN_ID,
MTAPI_NODE_ID, MTAPI_NODE_ID,
...@@ -160,8 +160,7 @@ void SimpleTest::TestBasic() { ...@@ -160,8 +160,7 @@ void SimpleTest::TestBasic() {
// with (max_queues + 1), see defect embb449 // with (max_queues + 1), see defect embb449
num_cores + 1, // max queues (default: 16) num_cores + 1, // max queues (default: 16)
1024, // queue capacity (default: 1024) 1024, // queue capacity (default: 1024)
4 // num priorities (default: 4) 4); // num priorities (default: 4)
);
for (int ii = 0; ii < 10000; ii++) { for (int ii = 0; ii < 10000; ii++) {
ArraySink<TEST_COUNT> asink; ArraySink<TEST_COUNT> asink;
......
...@@ -25,10 +25,10 @@ ...@@ -25,10 +25,10 @@
*/ */
#include <embb/mtapi/c/mtapi.h> #include <embb/mtapi/c/mtapi.h>
#include "mtapi_network_c_header-snippet.h" #include "mtapi/mtapi_network_c_header-snippet.h"
#include <embb/base/c/internal/unused.h> #include <embb/base/c/internal/unused.h>
#include "mtapi_check_status-snippet.h" #include "mtapi/mtapi_check_status-snippet.h"
#define NETWORK_DOMAIN 1 #define NETWORK_DOMAIN 1
#define NETWORK_LOCAL_NODE 3 #define NETWORK_LOCAL_NODE 3
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
#define NETWORK_REMOTE_NODE 3 #define NETWORK_REMOTE_NODE 3
#define NETWORK_REMOTE_JOB 4 #define NETWORK_REMOTE_JOB 4
#include "mtapi_network_c_action_function-snippet.h" #include "mtapi/mtapi_network_c_action_function-snippet.h"
void RunMTAPI_C_Network() { void RunMTAPI_C_Network() {
mtapi_status_t status; mtapi_status_t status;
...@@ -61,13 +61,13 @@ void RunMTAPI_C_Network() { ...@@ -61,13 +61,13 @@ void RunMTAPI_C_Network() {
&status); &status);
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_network_c_plugin_initialize-snippet.h" #include "mtapi/mtapi_network_c_plugin_initialize-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_network_c_remote_action_create-snippet.h" #include "mtapi/mtapi_network_c_remote_action_create-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_network_c_local_action_create-snippet.h" #include "mtapi/mtapi_network_c_local_action_create-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
job = mtapi_job_get(NETWORK_LOCAL_JOB, NETWORK_DOMAIN, &status); job = mtapi_job_get(NETWORK_LOCAL_JOB, NETWORK_DOMAIN, &status);
...@@ -94,7 +94,7 @@ void RunMTAPI_C_Network() { ...@@ -94,7 +94,7 @@ void RunMTAPI_C_Network() {
} }
} }
#include "mtapi_network_c_plugin_finalize-snippet.h" #include "mtapi/mtapi_network_c_plugin_finalize-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
mtapi_finalize(&status); mtapi_finalize(&status);
......
...@@ -25,16 +25,16 @@ ...@@ -25,16 +25,16 @@
*/ */
#include <embb/mtapi/c/mtapi.h> #include <embb/mtapi/c/mtapi.h>
#include "mtapi_opencl_c_header-snippet.h" #include "mtapi/mtapi_opencl_c_header-snippet.h"
#include "mtapi_check_status-snippet.h" #include "mtapi/mtapi_check_status-snippet.h"
#define OPENCL_DOMAIN 1 #define OPENCL_DOMAIN 1
#define OPENCL_NODE 2 #define OPENCL_NODE 2
#define OPENCL_JOB 2 #define OPENCL_JOB 2
// OpenCL Kernel Function for element by element vector addition // OpenCL Kernel Function for element by element vector addition
#include "mtapi_opencl_c_kernel-snippet.h" #include "mtapi/mtapi_opencl_c_kernel-snippet.h"
void RunMTAPI_C_OpenCL() { void RunMTAPI_C_OpenCL() {
mtapi_status_t status; mtapi_status_t status;
...@@ -59,10 +59,10 @@ void RunMTAPI_C_OpenCL() { ...@@ -59,10 +59,10 @@ void RunMTAPI_C_OpenCL() {
&status); &status);
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_opencl_c_plugin_initialize-snippet.h" #include "mtapi/mtapi_opencl_c_plugin_initialize-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_opencl_c_action_create-snippet.h" #include "mtapi/mtapi_opencl_c_action_create-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
status = MTAPI_ERR_UNKNOWN; status = MTAPI_ERR_UNKNOWN;
...@@ -90,7 +90,7 @@ void RunMTAPI_C_OpenCL() { ...@@ -90,7 +90,7 @@ void RunMTAPI_C_OpenCL() {
} }
} }
#include "mtapi_opencl_c_plugin_finalize-snippet.h" #include "mtapi/mtapi_opencl_c_plugin_finalize-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
mtapi_finalize(&status); mtapi_finalize(&status);
......
...@@ -42,15 +42,15 @@ ...@@ -42,15 +42,15 @@
#define PLUGIN_NODE_ID 1 #define PLUGIN_NODE_ID 1
#define PLUGIN_JOB_ID 1 #define PLUGIN_JOB_ID 1
#include "mtapi_check_status-snippet.h" #include "mtapi/mtapi_check_status-snippet.h"
#include "mtapi_c_plugin_task_schedule-snippet.h" #include "mtapi/mtapi_c_plugin_task_schedule-snippet.h"
#include "mtapi_c_plugin_task_start_cb-snippet.h" #include "mtapi/mtapi_c_plugin_task_start_cb-snippet.h"
#include "mtapi_c_plugin_task_cancel_cb-snippet.h" #include "mtapi/mtapi_c_plugin_task_cancel_cb-snippet.h"
#include "mtapi_c_plugin_action_finalize_cb-snippet.h" #include "mtapi/mtapi_c_plugin_action_finalize_cb-snippet.h"
void RunMTAPI_C_Plugin() { void RunMTAPI_C_Plugin() {
mtapi_status_t status; mtapi_status_t status;
...@@ -66,13 +66,13 @@ void RunMTAPI_C_Plugin() { ...@@ -66,13 +66,13 @@ void RunMTAPI_C_Plugin() {
&status); &status);
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_c_plugin_action_create-snippet.h" #include "mtapi/mtapi_c_plugin_action_create-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_c_plugin_get_job-snippet.h" #include "mtapi/mtapi_c_plugin_get_job-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
#include "mtapi_c_plugin_task_start-snippet.h" #include "mtapi/mtapi_c_plugin_task_start-snippet.h"
MTAPI_CHECK_STATUS(status); MTAPI_CHECK_STATUS(status);
mtapi_task_wait(task, MTAPI_INFINITE, &status); mtapi_task_wait(task, MTAPI_INFINITE, &status);
......
...@@ -191,8 +191,6 @@ REFERENCES_LINK_SOURCE = YES ...@@ -191,8 +191,6 @@ REFERENCES_LINK_SOURCE = YES
SOURCE_TOOLTIPS = YES SOURCE_TOOLTIPS = YES
USE_HTAGS = NO USE_HTAGS = NO
VERBATIM_HEADERS = YES VERBATIM_HEADERS = YES
CLANG_ASSISTED_PARSING = NO
CLANG_OPTIONS =
# ============================================================================== # ==============================================================================
# Options related to alphabetical class index # Options related to alphabetical class index
......
...@@ -34,9 +34,9 @@ priority inversion. As another advantage in real-time systems, the ...@@ -34,9 +34,9 @@ priority inversion. As another advantage in real-time systems, the
algorithms and data structures give certain progress guarantees. For algorithms and data structures give certain progress guarantees. For
example, wait-free data structures guarantee system-wide progress which example, wait-free data structures guarantee system-wide progress which
means that every operation completes within a finite number of steps means that every operation completes within a finite number of steps
independently of any other concurrent operations on the same data independently of any other concurrent operations on the same
structure. data structure.
\image html ../images/embb.png \image html ./images/embb.png
*/ */
...@@ -149,15 +149,23 @@ typedef void(*mtapi_ext_plugin_action_finalize_function_t)( ...@@ -149,15 +149,23 @@ typedef void(*mtapi_ext_plugin_action_finalize_function_t)(
* \ingroup C_MTAPI_EXT * \ingroup C_MTAPI_EXT
*/ */
mtapi_action_hndl_t mtapi_ext_plugin_action_create( mtapi_action_hndl_t mtapi_ext_plugin_action_create(
MTAPI_IN mtapi_job_id_t job_id, MTAPI_IN mtapi_job_id_t job_id, /**< [in] Job id */
MTAPI_IN mtapi_ext_plugin_task_start_function_t task_start_function, MTAPI_IN mtapi_ext_plugin_task_start_function_t task_start_function,
/**< [in] Task start function */
MTAPI_IN mtapi_ext_plugin_task_cancel_function_t task_cancel_function, MTAPI_IN mtapi_ext_plugin_task_cancel_function_t task_cancel_function,
/**< [in] Task cancel function */
MTAPI_IN mtapi_ext_plugin_action_finalize_function_t action_finalize_function, MTAPI_IN mtapi_ext_plugin_action_finalize_function_t action_finalize_function,
/**< [in] Finalize action function */
MTAPI_IN void* plugin_data, MTAPI_IN void* plugin_data,
/**< [in] Pointer to plugin data */
MTAPI_IN void* node_local_data, MTAPI_IN void* node_local_data,
/**< [in] Pointer to node local data */
MTAPI_IN mtapi_size_t node_local_data_size, MTAPI_IN mtapi_size_t node_local_data_size,
/**< [in] Size of node local data */
MTAPI_IN mtapi_action_attributes_t* attributes, MTAPI_IN mtapi_action_attributes_t* attributes,
MTAPI_OUT mtapi_status_t* status /**< [out] Pointer to attributes */
MTAPI_OUT mtapi_status_t* status/**< [out] Pointer to error code,
may be \c MTAPI_NULL */
); );
......
...@@ -281,8 +281,8 @@ static mtapi_task_hndl_t embb_mtapi_task_start( ...@@ -281,8 +281,8 @@ static mtapi_task_hndl_t embb_mtapi_task_start(
for (mtapi_uint_t kk = 0; kk < task->attributes.num_instances; for (mtapi_uint_t kk = 0; kk < task->attributes.num_instances;
kk++) { kk++) {
was_scheduled = was_scheduled & was_scheduled = (mtapi_boolean_t)(was_scheduled &
embb_mtapi_scheduler_schedule_task(scheduler, task, kk); embb_mtapi_scheduler_schedule_task(scheduler, task, kk));
} }
} }
......
...@@ -51,7 +51,10 @@ class StatusException : public embb::base::Exception { ...@@ -51,7 +51,10 @@ class StatusException : public embb::base::Exception {
} }
/** /**
* Returns the code of the exception. * Code associated with this exception
*
* \returns An integer representing the code of the exception
*
* \waitfree * \waitfree
*/ */
virtual int Code() const { return EMBB_ERROR; } virtual int Code() const { return EMBB_ERROR; }
......
...@@ -270,7 +270,6 @@ void mtapi_opencl_plugin_initialize( ...@@ -270,7 +270,6 @@ void mtapi_opencl_plugin_initialize(
NULL, NULL, &err); NULL, NULL, &err);
} }
if (CL_SUCCESS == err) { if (CL_SUCCESS == err) {
size_t work_group_size;
err = clGetDeviceInfo(plugin->device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE, err = clGetDeviceInfo(plugin->device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE,
sizeof(size_t), &plugin->work_group_size, NULL); sizeof(size_t), &plugin->work_group_size, NULL);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment