Предоставляет ли OpenCL какие-либо неявные гарантии того, что этого не произойдет?
Нет, неявная синхронизация не выполняется, если вы не используете одну очередь команд по порядку.
Если нет, если я вместо этого на ThreadB шаг 2 использую
clEnqueueCopyBuffer (CommandQueueA), чтобы и запись, и
операции копирования находятся в той же очереди команд, делает это
гарантировать, что они не могут работать одновременно, хотя
очередь разрешает выполнение вне очереди?
Нет, независимо от типа очереди (по порядку или по порядку),
Среда выполнения OpenCL не отслеживает зависимости памяти
команды. Пользователь несет ответственность за указание событий в списке ожидания,
если существует какая-либо зависимость между командами.
Следующая цитата может служить доказательством этого:
s3.2.1 Модель выполнения: контекст и очереди команд
Выполнение не по порядку: Команды выдаются по порядку, но выполняются
не дождитесь завершения, прежде чем будут выполнены следующие команды. любой
ограничения порядка применяются программистом через
явные команды синхронизации.
Это не прямой ответ на ваш вопрос, но я предполагаю, что если
какие-либо гарантии были предоставлены, они должны быть упомянуты в этом
раздел.
Если нет, есть ли лучшее решение, чем добавление
Событие WriteBuffer в ThreadA в лист ожидания
Команда CopyBuffer в ThreadB?
Если вы можете использовать одну очередь в порядке, это, вероятно, будет
более эффективно, чем событие с перекрестной очередью, по крайней мере, для некоторых
Реализации.