+++ /dev/null
-// ============================================================================
-/// @file test_lock_free_q.cpp
-/// @brief Benchmark lock free queue
-// ============================================================================
-
-
-#include <iostream>
-#include <glib.h> // GTimeVal + g_get_current_time
-#include <omp.h> // parallel processing support in gcc
-#include "array_lock_free_queue_single_producer.h"
-
-#ifndef N_CONSUMERS
-#define N_CONSUMERS 1
-#endif
-
-#ifndef N_ITERATIONS
-#define N_ITERATIONS 10000000
-#endif
-
-#ifndef QUEUE_SIZE
-#define QUEUE_SIZE 1000
-#endif
-
-void TestLockFreeQueue()
-{
- ArrayLockFreeQueueSingleProducer<int, QUEUE_SIZE> theQueue;
- GTimeVal iniTimestamp;
- GTimeVal endTimestamp;
-
- std::cout << "=== Start of testing lock-free queue ===" << std::endl;
- g_get_current_time(&iniTimestamp);
- #pragma omp parallel shared(theQueue) num_threads (2)
- {
- if (omp_get_thread_num() == 0)
- {
- //std::cout << "=== Testing Non blocking queue with " << omp_get_num_threads() << " threads ===" << std::endl;
-
- if (!omp_get_nested())
- {
- std::cerr << "WARNING: Nested parallel regions not supported. Working threads might have unexpected behaviour" << std::endl;
- std::cerr << "Are you running with \"OMP_NESTED=TRUE\"??" << std::endl;
- }
- }
-
- #pragma omp sections //nowait
- {
- #pragma omp section
- {
- // producer section. only 1 thread
- //#pragma omp parallel shared(theQueue) num_threads (1)
- {
- //if (omp_get_thread_num() == 0)
- //{
- // std::cout << "\t Producers: " << omp_get_num_threads() << std::endl;
- //}
- int i;
- for (i = 0 ; i < N_ITERATIONS ; i++)
- {
- while(!theQueue.push(i))
- {
- // queue full
- ;
- }
- }
- }
- }
-
- #pragma omp section
- {
- // consumer section
- #pragma omp parallel shared(theQueue) num_threads (N_CONSUMERS)
- {
- //if (omp_get_thread_num() == 0)
- //{
- // std::cout << "\t Consumers: " << omp_get_num_threads() << std::endl;
- //}
-
- int i;
- int result;
- #pragma omp for schedule(static) private(i, result) nowait
- for (i = 0 ; i < N_ITERATIONS ; i++)
- {
- while (!theQueue.pop(result))
- {
- // queue empty
- ;
- }
-
-#if N_CONSUMERS == 1
- // if there are several consumers this test will fail
- if (i != result)
- {
- std::cout << "FAILED i=" << i << " result=" << result << std::endl;
- }
-#endif
- }
- }
- }
- }
-
- } // #pragma omp parallel
-
- g_get_current_time(&endTimestamp);
-
- // calculate elapsed time
- GTimeVal elapsedTime;
- if (endTimestamp.tv_usec >= iniTimestamp.tv_usec)
- {
- elapsedTime.tv_sec = endTimestamp.tv_sec - iniTimestamp.tv_sec;
- elapsedTime.tv_usec = endTimestamp.tv_usec - iniTimestamp.tv_usec;
- }
- else
- {
- elapsedTime.tv_sec = endTimestamp.tv_sec - iniTimestamp.tv_sec - 1;
- elapsedTime.tv_usec = G_USEC_PER_SEC + endTimestamp.tv_usec - iniTimestamp.tv_usec;
- }
-
- std::cout << "Elapsed: " << elapsedTime.tv_sec << "." << elapsedTime.tv_usec << std::endl;
- std::cout << "=== End of testing lock-free queue ===" << std::endl;
-}
-
-int main(int /*argc*/, char** /*argv*/)
-{
-
- TestLockFreeQueue();
- std::cout << "Done!!!" << std::endl;
-
- return 0;
-}
-