Автор: Савенко Дмитрий
Дата создания: 10.10.2005
Версия: 0.1
Дата последнего изменения: 11.10.2005
Для одного приложения существует только один генератор заданий. Он создает рабочие модули и соответствующие входные файлы. Он использует функции библиотеки BOINC для регистрации рабочих модулей в базе данных.
Для создания рабочего модуля нужно пройти несколько этапов:
Написать в формате XML шаблон, который будет описывать рабочий модуль и соответствующие результаты. Обычно один и тот же шаблон используется для большого количества рабочих модулей.
Создать входные файлы для рабочего модуля и положить их в папку download.
Вызвать функцию 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Все остальные поля этой структуры должны быть установлены в ноль.