Я нашел способ разбить долго работающий алгоритм на параллельные куски. Я не совсем понимаю, поможет ли мой подход к реализации этого в OpenCL.
Одним из препятствий для меня является то, что для «результатов», которые я рассчитываю, я не знаю, сколько ожидать при выполнении каждой задачи.
Итак, мой план состоит в том, чтобы создать буфер с достаточным пространством, например, для 10 результатов, и еще один буфер, который просто хранит значение, указывающее, заполнен ли буфер.
Другая проблема, с которой я сталкиваюсь, заключается в том, что я потенциально запускаю много задач, и я не хочу предварительно вычислять входные данные в один большой длинный буфер, поскольку это может быть довольно много данных, я просто хочу вычислить входные данные прямо перед запуском каждой задачи.
Например, это некоторый псевдокод попытки подхода:
* Create a vector to store all results
* Create the "results" buffer.
* Create the "is-filled" buffer to store whether results buffer was filled.
while (some condition) {
// Before task.
* Create the "input" buffer with data (input data comes from an expensive function).
* Update kernel arguments.
// Run task.
queue.enqueueTask(kernel);
// After task.
* Read the "is-filled" buffer to determine whether "results" buffer is full.
if ("results" buffer is full) {
* Read the "results" buffer into the vector.
* Read the "input" buffer (now changed to indicate next inputs to 'resume' task)
* Reset "results" & "is-filled" buffers
}
}
Read remaining "results" buffer into the vector.
Это кажется неудобным, если бы был другой способ справиться с заполнением буферов, я бы хотел знать.
Однако наиболее тревожным моментом является то, что раздел «После задачи» блокирует выполнение и предотвращает возникновение параллелизма.
Итак, мои проблемы, которые являются препятствием для параллелизма: переменное количество результатов и изменение аргументов перед каждой задачей. Моя попытка рабочего процесса может быть еще более проблематичной :)
Как бы вы подошли к этому?
Я нашел эту ветку, где спрашивающий говорит о регулярной очистке буферов, пока рабочие ждут. Но я не могу найти никаких подробностей об этой технике. OpenCL считывает буфер результатов переменного размера из графического процессора