- Метод IsCombinationValid принимает список выбранных значений и
проверяет, образуют ли они допустимую комбинацию. - Если введенные данные (например, x, y, z) недействительны, все комбинации, начинающиеся
с этого ввода, также недействительны, поэтому их можно пропустить.
Код: Выделить всё
void Finder(uint32_t threadIdx, uint32_t firstListStartElementIdx, uint32_t firstListEndElementIdx, std::vector &lists) {
std::vector listsCurrentElementIdx;
listsCurrentElementIdx.push_back(firstListStartElementIdx);
size_t firstListElementCount = lists[0].size();
CheckCurrentList:;
if (isFound) return;
uint32_t currentListIdx = listsCurrentElementIdx.size() - 1;
if (currentListIdx == 0) {
if (listsCurrentElementIdx.back() >= firstListEndElementIdx) {
printf("### failed : threadIdx %u\n", threadIdx);
return;
} else {
listsCurrentElementIdx.push_back(0);
goto CheckCurrentList;
}
}
std::vector ¤tList = lists[currentListIdx];
uint32_t ¤tListElementIdx = listsCurrentElementIdx.back();
while (currentListElementIdx < currentList.size()) {
if (!IsCombinationValid(lists, listsCurrentElementIdx)) goto CurrentListElementInvalid;
// Valid combination found
if (lists.size() == listsCurrentElementIdx.size()) {
isFound = 1;
// Print combination
return;
}
listsCurrentElementIdx.push_back(0);
goto CheckCurrentList;
CurrentListElementInvalid:;
++currentListElementIdx;
}
listsCurrentElementIdx.pop_back();
listsCurrentElementIdx.back()++;
goto CheckCurrentList;
}
Проблема:
Я не знаю, как эффективно разделить работу между потоками графического процессора для решения этой проблемы:
- Каждому потоку может потребоваться выполнить обратный поиск независимо , а некоторые потоки могут завершиться раньше времени, не найдя допустимой комбинации, что приведет к простою потоки.
- Синхронизация работы и обмен частичными результатами между потоками кажутся сложными в этой рекурсивной проблеме с возвратом.
Подробнее здесь: https://stackoverflow.com/questions/793 ... large-data
Мобильная версия