Автор: Савенко Дмитрий
Дата создания: 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Все остальные поля этой структуры должны быть установлены в ноль.