Я пытаюсь ускорить некоторый код с помощью CUDA и нахожусь под ограничениями максимально возможного сохранения читабельности/обслуживаемости кода.
Я нашел и распараллелил функцию, скрытую в нескольких функциях/циклах. На эту функцию приходится ~ 98% времени обработки, но она не использует достаточно параллелизма, чтобы быть полезной (порядка пары блоков..). При одновременном выполнении код работает намного быстрее. Однако в результате я вынужден поддерживать большой список объектов стека, которые я должен перебирать несколько раз, см. код ниже:
void do_work(int i, ...) {
// computationally expensive stuff...
}
void prereq_stuff(int i) {
int foo;
double bar;
// lots of big divergent control structures...
do_work(i); // maybe arrive here..
// output and what not that needs foo/bar...
}
int main() {
for (int i = 0; i < BIG_NUMBER; i++) {
prereq_stuff(i);
}
return 0;
}
Превратился в...
// a struct that contains all the stack data..
struct StackMem {
int foo;
double bar;
};
void do_work_on_gpu(List<StackMem> contexts) {
// launch a kernel to handle to expensive stuff..
}
void prereq_stuff(StackMem* context, int i) {
// maybe queue up data for do_work_on_gpu()...
}
void cleanup_stuff(StackMem* context, int i) {
// output and what not that needs foo/bar...
}
int main() {
List<StackMem> contexts; // some container of stack objects
for (int i = 0; i < BIG_NUMBER; i++) {
StackMem* context = contexts.add();
prereq_stuff(context, i);
}
do_work_on_gpu(contexts); // calls the CUDA kernel
for (int i = 0; i < contexts.size(); i++) {
cleanup_stuff(contexts.get(i), i);
}
return 0;
}
Есть ли какая-то конструкция/шаблон дизайна, которую я могу здесь использовать? Или это настолько просто, насколько это возможно, когда все данные для вызова do_work() доступны одновременно?
prereq_stuff
по сравнению сdo_work on_gpu
? Я не уверен, что есть хороший общий ответ, и этот вопрос лучше задать на Code Review. - person BlameTheBits   schedule 18.07.2017