Если ядро запускается с разными потоками,
Можем ли мы гарантировать, что каждый поток не чередуется?
Кажется, что разные потоки ядра чередуются вместе.
Я хочу, чтобы выпущенный поток ядра ждал, пока предыдущий запущенный поток ядра не завершит свою работу.
Причина, по которой я хочу этого, заключается в том, что другое потоковое ядро не должно загрязнять данные кэша L2, используемые текущим запущенным потоком ядра.
Это возможно?
@ Роберт, спасибо. Позвольте мне погрузиться в вашу страницу ссылок
Обычный (поточный) метод предотвращения перекрытия действий CUDA X и Y заключается в запуске этих действий в один и тот же поток.
@ Роберт, я знаю, что это основное. Но проблема в том, что второе ядро должно быть запущено после завершения memcpy. Это означает, что второй поток ядра должен отличаться от первого потока ядра, поскольку второе ядро не должно ждать memcpy.
@tera Первая заключалась в том, что функция memcpy (предположим, поток 2) прямо перед запуском второго ядра (поток 2) копирует данные, необходимые во втором ядре. Последнее заключалось в том, что первое ядро (поток 1) должно копировать данные с устройства на хост (поток 1) после его выполнения (в моем случае), а второе ядро (поток 2) не должно ждать функцию memcpy (поток 1) если поток другой.
События позволяют вам синхронизировать потоки друг с другом, не синхронизируя их с вызывающим потоком ЦП. Вы можете использовать cudaEventRecord(event1, stream1)
, чтобы записать событие в потоке 1, а затем использовать cudaStreamWaitEvent(stream2, event1)
, чтобы заставить поток 2 ждать этого события, прежде чем продолжить. Если вы затем изучите свое приложение в nvprof, вы заметите, что синхронизация между потоками всегда происходит в этом событии.
Я видел, как люди настраивали беспорядочные вызовы cudaStreamSynchronize(), пытаясь использовать вызывающий поток ЦП для создания синхронизации между потоками. Не делайте этого. Используйте события.
запустить событие в конце ядра, которое вы запускаете в потоке A. В потоке B выполните
cudaStreamWaitEvent
событие, запущенное в потоке A. После этого момента в потоке B все будет ждать, пока поток A доберется до события. Похоже, ваш вопрос является дубликатом Вот этот.