@@ -15,66 +15,83 @@ using namespace it_lab_ai;
1515int main (int argc, char * argv[]) {
1616 std::string model_name = " alexnet_mnist" ;
1717 RuntimeOptions options;
18- size_t num_photo = 1000 ;
19- size_t batch_size = 32 ;
20-
21- for (int i = 1 ; i < argc; ++i) {
22- if (std::string (argv[i]) == " --model" && i + 1 < argc) {
23- model_name = argv[++i];
24- } else if (std::string (argv[i]) == " --onednn" ) {
25- options.backend = Backend::kOneDnn ;
26- if (options.par_backend != ParBackend::kSeq ) {
27- std::cout << " Warning: oneDNN backend is not compatible with parallel "
28- " execution. Disabling parallelism."
29- << ' \n ' ;
30- options.par_backend = ParBackend::kSeq ;
31- }
32- } else if (std::string (argv[i]) == " --parallel" && i + 1 < argc) {
33- if (options.backend == Backend::kOneDnn ) {
34- std::cout << " Warning: Parallel execution is not compatible with "
35- " oneDNN backend. Ignoring --parallel option."
36- << ' \n ' ;
37- i++;
38- continue ;
39- }
18+ // По умолчанию
19+ size_t num_photo = 1000 ;
20+ size_t batch_size = 32 ;
21+
22+ // Сначала соберём все аргументы, не являющиеся ключами
23+ std::vector<size_t > numeric_args;
24+
25+ for (int i = 1 ; i < argc; ++i) {
26+ std::string arg = argv[i];
27+ if (arg == " --model" && i + 1 < argc) {
28+ model_name = argv[++i];
29+ }
30+ else if (arg == " --onednn" ) {
31+ options.backend = Backend::kOneDnn ;
32+ if (options.par_backend != ParBackend::kSeq ) {
33+ std::cout << " Warning: oneDNN backend is not compatible with parallel execution. Disabling parallelism.\n " ;
34+ options.par_backend = ParBackend::kSeq ;
35+ }
36+ }
37+ else if (arg == " --parallel" && i + 1 < argc) {
38+ if (options.backend == Backend::kOneDnn ) {
39+ std::cout << " Warning: Parallel execution is not compatible with oneDNN backend. Ignoring --parallel option.\n " ;
40+ ++i; // пропускаем следующий аргумент (название бэкенда)
41+ continue ;
42+ }
43+ std::string backend_str = argv[++i];
44+ if (backend_str == " tbb" )
45+ options.par_backend = ParBackend::kTbb ;
46+ else if (backend_str == " threads" || backend_str == " stl" )
47+ options.par_backend = ParBackend::kThreads ;
48+ else if (backend_str == " omp" )
49+ options.par_backend = ParBackend::kOmp ;
50+ else {
51+ std::cerr << " Unknown parallel backend: " << backend_str << " . Using default (Threads).\n " ;
52+ options.par_backend = ParBackend::kThreads ;
53+ }
54+ }
55+ else if (arg == " --threads" && i + 1 < argc) {
56+ options.threads = std::stoi (argv[++i]);
57+ }
58+ else {
59+ // Попробуем преобразовать аргумент в число
60+ try {
61+ size_t val = std::stoul (arg);
62+ numeric_args.push_back (val);
63+ } catch (...) {
64+ std::cerr << " Warning: unknown argument ignored: " << arg << " \n " ;
65+ }
66+ }
67+ }
4068
41- std::string backend_str = argv[++i];
42- if (backend_str == " tbb" ) {
43- options.par_backend = ParBackend::kTbb ;
44- } else if (backend_str == " threads" || backend_str == " stl" ) {
45- options.par_backend = ParBackend::kThreads ;
46- } else if (backend_str == " omp" ) {
47- options.par_backend = ParBackend::kOmp ;
48- } else {
49- std::cerr << " Unknown parallel backend: " << backend_str
50- << " . Using default (Threads)." << ' \n ' ;
51- options.par_backend = ParBackend::kThreads ;
52- }
53- } else if (std::string (argv[i]) == " --threads" && i + 1 < argc) {
54- options.threads = std::stoi (argv[++i]);
69+ // Интерпретируем собранные числа:
70+ // первое (или единственное) -> num_photo
71+ // второе (если есть) -> batch_size
72+ if (!numeric_args.empty ()) {
73+ size_t val = numeric_args[0 ];
74+ if (val < 1 ) {
75+ std::cerr << " Warning: num_photo cannot be less than 1. Using 1.\n " ;
76+ num_photo = 1 ;
77+ } else if (val > 50000 ) {
78+ std::cerr << " Warning: num_photo cannot exceed 50000. Using 50000.\n " ;
79+ num_photo = 50000 ;
5580 } else {
56- try {
57- size_t input_value = std::stoul (argv[i]);
58-
59- if (input_value < 1 ) {
60- std::cerr << " Warning: num_photo cannot be less than 1. Using 1."
61- << ' \n ' ;
62- num_photo = 1 ;
63- } else if (input_value > 50000 ) {
64- std::cerr << " Warning: num_photo cannot exceed 50000. Using 50000."
65- << ' \n ' ;
66- num_photo = 50000 ;
67- } else {
68- num_photo = input_value;
81+ num_photo = val;
82+ }
83+
84+ if (numeric_args.size () >= 2 ) {
85+ batch_size = numeric_args[1 ];
86+ if (batch_size < 1 ) {
87+ std::cerr << " Warning: batch_size cannot be less than 1. Using 1.\n " ;
88+ batch_size = 1 ;
6989 }
70- } catch (const std::exception& e) {
71- std::cerr << " Error: Invalid numeric argument: " << e.what () << argv[i]
72- << " . Using default value: 1000" << ' \n ' ;
73- num_photo = 1000 ;
74- }
90+ // Можно добавить верхнее ограничение, например, 2048
7591 }
76- }
92+ }
7793
94+ std::cout<< " batch = " << batch_size <<' \n ' ;
7895 std::string dataset_path;
7996 if (model_name == " alexnet_mnist" ) {
8097 dataset_path = MNIST_PATH ;
0 commit comments