Я работаю над относительно большим набором библиотек C-кода с последовательным кодом, которые затем будут распараллеливаться в CUDA моими сотрудниками.
Для этого проекта мой код сводится к
#include "Initialize.cpp"
#include "PerformMoves.cpp"
#include "CollectResults.cpp"
main()
{
//DECLARE General Vars
Initialize();
for (unsigned int step=0; step < maxStep; step++)
{
PerformMoves();
}
CollectResults();
}
Теперь шаги, которые я выполняю в Initialize и PerformMoves, будут сильно отличаться в зависимости от того, какую симуляцию я создаю. Скорость - это максимальная производительность, так как мой код представляет собой симуляцию Монте-Карло, которая будет выполнять миллионы ходов, каждый из которых предполагает потенциально тысячи вычислений. Таким образом, я хочу избежать ненужных условий.
Таким образом, я, по сути, хочу разные модули C "включай и работай", например,
InitializeSimType1.cpp
InitializeSimType2.cpp
InitializeSimType3.cpp
PerformMovesType1.cpp
PerformMovesType2.cpp
PerformMovesType3.cpp
....
Каждый оптимизирован для определенного типа процедуры моделирования, без "пуха" больших условных выражений для обработки множества случаев.
В настоящее время у меня есть два разных типа симуляций, и они просто находятся в двух разных папках и компилируются следующим образом:
g ++ Main.cc Initialize.cpp
PerformMoves.cpp CollectResults.cpp -o
MC_Prog
Я хотел бы перейти к какой-то схеме условной компиляции, где у меня есть какой-то конфигурационный файл сортировки, где я указываю опции, и он берет правильные файлы cpp и компилирует их.
Я бы предположил, что makefile + config файлы - моя лучшая ставка, но помимо базовых целей и очень линейной компиляции я довольно новичок в мире сложных make-файлов.
Какими хорошими способами я мог бы создать систему компиляции на основе списка, которая позволила бы пользователям с базовыми знаниями C легко создавать цели с помощью модулей, которые они хотят. Мои конечные пользователи не будут обладать большими знаниями по make-файлам (или знаниями по программированию в целом), поэтому о сложной системе с их стороны не может быть и речи. Я хочу, чтобы они в основном имели прозрачную систему, управляемую файлами конфигурации, которая позволит им выбрать один модуль Initialize, один модуль PerformMoves и один модуль CollectResults. После того, как они изменили этот файл конфигурации своими выборами, я хочу, чтобы они могли выполнять компиляцию одной командой.
Другими словами, я хочу иметь возможность создавать README, который направляет пользователей:
- Введите эти записи в этот файл конфигурации
(дает имя файла конфигурации, опции для каждой записи файла конфигурации) ...
- Компилировать с помощью этой команды (дает одну команду)
Я знаю, что это довольно абстрактный и сложный вопрос, но я знаю, что есть некоторые эксперты по Makefile / c, которые могли бы предложить мне хорошее руководство.