Возможно ли предоставить общий доступ к массиву указателей между несколькими ядрами в OpenCL. Если да, то как мне его реализовать? Если я не ошибаюсь, что может быть и так, то единственным способом обмена вещами между ядрами будет общий cl_mem, однако я также думаю, что они не могут содержать указатели.Pointer Array, разделяемый между ядрами OpenCL
ответ
Это невозможно в OpenCL 1.x, поскольку хост и устройство имеют полностью отдельные пространства памяти, поэтому буфер, содержащий указатели на хост, не имеет смысла на стороне устройства.
Однако OpenCL 2.0 поддерживает общую виртуальную память (SVM), поэтому память, содержащая указатели, является законной, поскольку хост и устройство совместно используют адресное пространство. Однако есть три разных уровня детализации, которые ограничивают то, на что вы можете ссылаться. В самом грубом случае они могут ссылаться только на местоположения в том же буфере или других буферах SVM, которые в настоящее время принадлежат устройству. Да, cl_mem
по-прежнему является способом передачи в буфер к ядру, но в OpenCL 2.0 с SVM этот буфер может содержать указатели.
Редактировать/добавить: OP указывает, что они просто хотят обмениваться указателями между ядрами. Если это всего лишь указатели на устройства, вы можете сохранить их в буфере в одном ядре и прочитать их из буфера в другом ядре. Они могут относиться только к __global, а не к __local памяти. И без SVM они не могут использоваться на хосте. Разумеется, хосту необходимо будет выделить буфер и передать его в оба ядра для их использования. Что касается хоста, это просто непрозрачная память. Только ядра знают, что они __global указатели.
Я знаю, что указатели хоста не будут работать на gpu. Я также знаю о SVM, но это не то, о чем я прошу. Я просто хочу поделиться массивом указателей между несколькими разными ядрами. – Addi
Указатели устройств? Затем просто сохраните их в буфере в одном ядре и прочитайте их из буфера в другом ядре. Однако они не могут использоваться на хосте. Разумеется, хосту необходимо будет выделить буфер и передать его в оба ядра для их использования. – Dithermaster
ну, вопрос о том, как это сделать. – Addi
Пожалуйста, подумайте об удалении тега C, поскольку этот вопрос, похоже, не касается проблемы, характерной для языка программирования C. –