Line data Source code
1 : /////////////////////////////////////////////////////////////////////////// 2 : // Spetabaru - Berenger Bramas MPCDF - 2017 3 : // Under LGPL Licence, please you must read the LICENCE file. 4 : /////////////////////////////////////////////////////////////////////////// 5 : 6 : #include <future> 7 : 8 : #include "UTester.hpp" 9 : 10 : #include "Data/SpDataAccessMode.hpp" 11 : #include "Utils/SpUtils.hpp" 12 : 13 : #include "Task/SpTask.hpp" 14 : #include "Legacy/SpRuntime.hpp" 15 : 16 : class TestWindow : public UTester< TestWindow > { 17 : using Parent = UTester< TestWindow >; 18 : 19 1 : void TestBasic(){ 20 : { 21 1 : const int NbTasks = 10; 22 22 : std::promise<int> promises[NbTasks]; 23 : 24 1 : const int NbThreads = 10; 25 2 : SpRuntime runtime(NbThreads); 26 : 27 1 : int readVal = 0; 28 : 29 11 : for(int idxTask = 0 ; idxTask < NbTasks ; ++idxTask){ 30 0 : runtime.task(SpRead(readVal), 31 20 : [&,idxTask](const int& /*readVal*/){ 32 10 : promises[idxTask].get_future().get(); 33 10 : usleep(1000); 34 32 : }); 35 : } 36 : 37 11 : for(int idxTask = NbTasks ; idxTask < 2*NbTasks ; ++idxTask){ 38 10 : runtime.waitRemain(idxTask); 39 : } 40 : 41 11 : for(int idxTaskPromise = 0 ; idxTaskPromise < NbTasks ; ++idxTaskPromise){ 42 10 : promises[idxTaskPromise].set_value(0); 43 165 : for(int idxTask = NbTasks-idxTaskPromise-1 ; idxTask < 2*NbTasks ; ++idxTask){ 44 155 : runtime.waitRemain(idxTask); 45 : } 46 : } 47 : 48 1 : runtime.waitAllTasks(); 49 : } 50 : { 51 1 : const int NbThreads = 10; 52 2 : SpRuntime runtime(NbThreads); 53 : 54 1 : int readVal = 0; 55 2 : std::promise<int> promise0; 56 2 : std::promise<int> promise1; 57 : 58 0 : runtime.task(SpRead(readVal), 59 1 : [&](const int& /*readVal*/){ 60 1 : promise0.get_future().get(); 61 2 : }); 62 : 63 0 : runtime.task(SpRead(readVal), 64 1 : [&](const int& /*readVal*/){ 65 1 : promise1.get_future().get(); 66 2 : }); 67 : 68 1 : runtime.waitRemain(3); 69 : 70 1 : promise0.set_value(0); 71 1 : runtime.waitRemain(2); 72 : 73 1 : promise1.set_value(0); 74 : 75 1 : runtime.waitAllTasks(); 76 : } 77 1 : } 78 : 79 1 : void SetTests() { 80 1 : Parent::AddTest(&TestWindow::TestBasic, "Basic test for commute access"); 81 1 : } 82 : }; 83 : 84 : // You must do this 85 1 : TestClass(TestWindow) 86 : 87 :