Я бы хотел распараллелить C -программу, которая рекурсивно вычисляет размер каталога и его подкаталогов, используя OpenMP и C.
Моя проблема в том, что когда я получаю в каталог, используя opendir
, и я перебираю подкаталоги, используя readdir
, я могу получить к ним доступ только один за другим, пока не достигну последнего подкаталога. Все это работает хорошо последовательно.
Однако, при распараллеливании программы, я думаю, что имеет смысл разделить количество подкаталогов пополам (или даже меньших разделов) и проходить по подкаталогам с помощью OpenMp. Задачи.
Очевидно, что я не могу просто разделить размер задачи (= количество подкаталогов) пополам из-за структуры for-l oop, и подобные циклы нельзя распараллелить, используя #pragma omp for
.
Кто-нибудь знает, как разбить эту функцию на задачи? Любая помощь будет принята с благодарностью.
Это часть моего кода (я удалил части, которые я не считаю уместными для этого вопроса.)
int calculate_folder_size(const char *path) {
struct stat sb;
if (S_ISREG(sb.st_mode)) { // if it's a file, not a directory (base case)
return sb.st_size;
}
DIR *folder = opendir(path);
struct dirent *element;
size_t size = 4096;
for (element = readdir(folder); element != NULL; element = readdir(folder)) {
//(...)
if (element->d_type == DT_DIR) {
// recursive call of calculate_folder_size
size += calculate_folder_size(name);
} else {
//(...)
}
}
}
closedir(folder);
return size;
}