Автор: Савенко Дмитрий
Дата создания: 10.10.2005
Версия: 0.1
Дата последнего изменения: 11.10.2005


WORK GENERATOR

Для одного приложения существует только один генератор заданий. Он создает рабочие модули и соответствующие входные файлы. Он использует функции библиотеки BOINC для регистрации рабочих модулей в базе данных.

Создание рабочего модуля

Для создания рабочего модуля нужно пройти несколько этапов:

  1. Написать в формате XML шаблон, который будет описывать рабочий модуль и соответствующие результаты. Обычно один и тот же шаблон используется для большого количества рабочих модулей.

  2. Создать входные файлы для рабочего модуля и положить их в папку download.

  3. Вызвать функцию BOINC, которая создает для рабочего модуля запись в базе данных.

При тестировании вы можете создать один рабочий модуль с помощью create_work, а затем использовать программу-демона make_work для копирования этого рабочего модуля так, как это необходимо.

Формат шаблона

Формат шаблона описан здесь: http://boinc.berkeley.edu/tools_work.php. Возможные атрибуты шаблона лежут тут: http://boinc.berkeley.edu/work.php.

Помещение файлов в нужную директорию

Если вы используете простую директорию download, скопируйте файлы туда. Если вы используете иерархические директории upload/download, необходимо положить каждый файл в подходящую директорию, которая вычисляется с помощью вызова следующей функции:

dir_hier_path(
    const char* filename,
    const char* root,       // root of download directory
    int fanout,             // from config.xml
    bool new_hash,          // use true here
    char* result            // path of file in hierarchy
);

Можно также использовать скрипт

dir_hier_path filename
Он печатает полное имя нужной директории и должен запускаться из корневой директории проекта.

Создание записи для рабочего модуля

После того, как входные файлы будут помещены в папку download, рабочий модуль может быть создан как с помощью вызова программы create_work, так и с помощью функции create_work().

Программа create_work имеет следующий вид:

create_work
    -appname name                       // application name
    -wu_name name                       // workunit name
    -wu_template filename               // WU template filename
                                        // relative to project root
    -result_template filename           // result template filename
                                        // relative to project root
    [ -batch n ]
    [ -priority n ]

    // The following are normally supplied in the WU template:
    [ -rsc_fpops_est x ]
    [ -rsc_fpops_bound x ]
    [ -rsc_memory_bound x ]
    [ -rsc_disk_bound x ]
    [ -delay_bound x ]
    [ -min_quorum x ]
    [ -target_nresults x ]
    [ -max_error_results x ]
    [ -max_total_results x ]
    [ -max_success_results x ]

    infile_1 ... infile_m           // input files

Параметры рабочего модуля описаны здесь. Программа должна запускаться из корневой директории проекта.

Чтобы создать задание из собственной программы, нужно использовать две следующие функции (из файлов crypt.c, backend_lib.c, backend_lib.h):

int read_key_file(char* path, R_RSA_PRIVATE_KEY& key);

int create_work(
    DB_WORKUNIT&,
    const char* wu_template,                  // contents, not path
    const char* result_template_filename,     // relative to project root
    const char* result_template_filepath,    // absolute,
        // or relative to current dir
    const char* infile_dir,                   // where input files are
    const char** infiles,                     // array of input file names
    int ninfiles
    R_RSA_PRIVATE_KEY& key,             // upload authentication key
    SCHED_CONFIG&
);

Первая из них читает приватный ключ из файла. Она используется для чтения авторизационного ключа на загрузку файла. Вторая создает рабочий модуль и один или более результатов. Аргументы похожи на аргументы соответствующей утилиты. Некоторая информация также содержится в стуктуре WORKUNIT, а именно следующие поля:

name
appid
batch
rsc_fpops
rsc_iops
rsc_memory
rsc_disk
delay_bound
Все остальные поля этой структуры должны быть установлены в ноль.