Разработка параллельных и распределённых приложений с использованием шаблона состоит из описания структуры приложения: Разработки кода иницирующего начало вычислений с помощью библиотек времени исполнения из пакета TempletSDK #include "gpTBag.h" #include #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 #include #include "../Rtl/gprtmpi.h" /*$GPBS$TB$!include!*/ #include #include #include /*$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$*/ } }