Что я пытаюсь сделать:Как выполнить реляционное соединение на двух контейнерах данных на графическом процессоре (предпочтительно CUDA)?
На GPU, я пытаюсь имитировать соглашения, используемые SQL в реляционной алгебре для выполнения объединений в таблицах (например, Inner Join, Outer Join, Cross Join). В приведенном ниже коде я хочу выполнить Inner Join. Представьте себе две таблицы (контейнеры), где одна таблица является родительской/основной таблицей, а другая - дочерней таблицей. Отношения между родителями и дочерними элементами от 1 до многих (или 1 к одному, если нет дочерних элементов Child_ParentID, которые соответствуют элементу в Parent_ID).
Пример входных данных:
Parent_IDs: [1, 2, 3, 4, 5] ... 5 elements
Parent_Values: [0, 21, 73, 0, 91] ... 5 elements
Child_ParentIDs: [1, 1, 1, 2, 3, 5, 5] ... 7 elements
Child_Permanences: [120, 477, 42, 106, 143, 53, 83] ... 7 elements
Child_Values: [0, 0, 0, 0, 0, 0, 0] ... 7 elements
Операция в качестве запроса SQL: Описание
SELECT child.permanence * parent.value FROM child, parent WHERE child.parent_id = parent.id;
Операция:
Регистрация Child_ParentIDs чтобы получить доступ к Parent_IDs соответствующие Parent_Values. Используйте соответствующие Parent_Values для умножения на соответствующие Child_Permanences и поместите результат каждой операции в Child_Values.
Ожидаемый результат (Child_Values единственный измененный вектор во время операции):
Child_ParentIDs: [1, 1, 1, 2, 3, 5, 5] ... 7 elements
Child_Permanences: [120, 477, 42, 106, 143, 53, 83] ... 7 elements
Child_Values: [0, 0, 0, 2226, 10439, 4823, 7553] ... 7 elements
Объяснение (в случае, если это не имеет смысла):
Значение 2226 получается путем умножения 106 и 21. 10439 было умножено на 143 и 73. Также обратите внимание, что ВСЕ записи сохраняются на дочерних векторах (все 7 элементов все еще существуют в выходе, хотя с отдельными элементами Child_Values обновлены). Родительские векторы не сохраняются на выходе (уведомление ParentID 4 отсутствует в списке векторов, и там нет «фиктивного» заполнителя). Это поведение «Внутренняя связь».
Идеи элегантных решений, которые я не получил работу:
-Utilizing CUDA Динамический параллелизм. Возможно, единственное решение для всего Интернета, которое я нашел, делает именно то, что я пытаюсь сделать, это here-part 1 и here-part 2.
-использование хеширующих операций CUDPP;
-Alenka DB.
И, наконец, мой вопрос подтвердил:
Есть ли рабочий раствор с чисто GPU перспектив (желательно с CUDA, но OpenCL будет работать тоже) для выполнения Relational Присоединяется на два отдельных контейнерах данных, так что данные можно выполнять поиск, а элементы обновляются параллельно через указанные соединения?
EDIT
Parent_IDs не всегда будет последовательность. Во время выполнения можно удалить элементы из родительских векторов. Вновь вставленные родительские элементы всегда будут добавляться с идентификатором, который выставляется из идентификатора последнего элемента. С учетом сказанного я понимаю, что это означает, что элементы Child могут оставаться сиротами, но я не рассматриваю это решение здесь.
TL; DR: Вы действительно просто спрашиваете, существует ли это готовое решение? – talonmies
Если вы не хотите читать это, то обязательно укажите мне готовое решение. Я адаптирую его к моим потребностям и обновляю здесь. – aiwyn
Я думаю, что вы можете построить решение на основе решения в http://stackoverflow.com/a/34371396/5153458 – eg0x20