Разработка параллельных и распределённых приложений с использованием шаблона состоит из описания структуры приложения:
<module id="TB" templet="" rem=""> <include file="../Rtl/gprtmpi.h" module=""/> <param id="rtl" value="GPRTMPI"/> <assemble id="TaskBag" templet="TBAG" rem="Task bag template"> </assemble> </module>
Разработки кода иницирующего начало вычислений с помощью библиотек времени исполнения из пакета TempletSDK
#include "gpTBag.h" #include <stdio.h> #include "time_measurement.h" int main(int argc, char* argv[]){ int prc_num = 4; unsigned long start = get_current_time_in_us(); TB::TaskBag bag(prc_num, &argc, &argv); bag.run(); printf("Done in %6.6f s\n", (get_current_time_in_us()-start)/1000000.0 ); return 0; }
Сгенерированного по файлу структуры приложения заголовочного файла с пользовательскими секциями
#ifndef _GRAPH_PLUS_MODULE_TB #define _GRAPH_PLUS_MODULE_TB #include <string.h> #include <assert.h> #include "../Rtl/gprtmpi.h" /*$GPBS$TB$!include!*/ #include <math.h> #include <stdio.h> #include <stdlib.h> /*$GPBS$*/ // namespace TB{ //Task bag template class TaskBag:public GPRTMPI::TBag{ public: class TaskBagTask:public TBag::Task{ public: TaskBagTask(); virtual~TaskBagTask(); void send_task(); void recv_task(); void send_result(); void recv_result(); /*$GPBS$TaskBag$!taskuserdata!*/ /*$GPBS$*/ }; public: TaskBag(int num_prc, int *argc, char ***argv); virtual ~TaskBag(); TBag::Task* createTask(); bool if_job(); void put(Task*t); void get(Task*t); void proc(Task*t); /*$GPBS$TaskBag$!userdata!*/ /*$GPBS$*/ }; } #endif
И сгенерированного по файлу структуры приложения файла исходного кода с реализацией классов с пользовательскими секциями
#include "gpTBag.h" namespace TB{ /*$GPBS$TB$!globals!*/ // put global variables and funcs here /*$GPBS$*/ //////////////////////class TaskBag//////////////////// //Task bag template TaskBag::TaskBag(int num_prc, int *argc, char ***argv):TBag(num_prc, argc, argv) { /*$GPBS$TaskBag$!constructor!*/ /*$GPBS$*/ } TaskBag::~TaskBag() { /*$GPBS$TaskBag$!destructor!*/ /*$GPBS$*/ } TaskBag::TaskBagTask::TaskBagTask():TBag::Task() { /*$GPBS$TaskBag$!taskconstructor!*/ /*$GPBS$*/ } TaskBag::TaskBagTask::~TaskBagTask() { /*$GPBS$TaskBag$!taskdestructor!*/ /*$GPBS$*/ } void TaskBag::TaskBagTask::send_task() { /*$GPBS$TaskBag$!task_send_task!*/ /*$GPBS$*/ } void TaskBag::TaskBagTask::recv_task() { /*$GPBS$TaskBag$!task_recv_task!*/ /*$GPBS$*/ } void TaskBag::TaskBagTask::send_result() { /*$GPBS$TaskBag$!task_send_result!*/ /*$GPBS$*/ } void TaskBag::TaskBagTask::recv_result() { /*$GPBS$TaskBag$!task_recv_result!*/ /*$GPBS$*/ } /*$GPBS$TaskBag$!usercode!*/ // place your code here /*$GPBS$*/ GPRTMPI::TBag::Task* TaskBag::createTask(){return new TaskBagTask;} bool TaskBag::if_job(){ /*$GPBS$TaskBag$if_job*/ return 0; /*$GPBS$*/ } void TaskBag::put(Task*t){ TaskBagTask* mt=(TaskBagTask*)t; /*$GPBS$TaskBag$put*/ /*$GPBS$*/ } void TaskBag::get(Task*t){ TaskBagTask* mt=(TaskBagTask*)t; /*$GPBS$TaskBag$get*/ /*$GPBS$*/ } void TaskBag::proc(Task*t){ TaskBagTask* mt=(TaskBagTask*)t; /*$GPBS$TaskBag$proc*/ /*$GPBS$*/ } }