В программировании CUDA, как понять, выполнило ли ядро ​​GPU свою задачу? - PullRequest
1 голос
/ 27 октября 2019

В программировании на CUDA предположим, что я вызываю функцию ядра с хоста.

Предположим, функция ядра:

my_kernel_func(){
 doing some tasks utilizing multiple threads
}

Теперь с хоста, который я вызываю с помощью,

my_kernel_func<<<grid,block>>>();

В примерах NVDIA после этого они вызвали еще три функции:

cudaGetLastError()

CUDA Doc: Возвращает последнюю ошибку, сгенерированную любой изво время выполнения вызывает тот же хост-поток и сбрасывает его на cudaSuccess.

cudaMemcpy()

CUDA Doc: Копирует количество байтов из области памяти, на которую указывает src в область памяти, на которую указывают dst, , где kind указывает направление копирования и должен быть одним из cudaMemcpyHostToHost, cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice, или cudaMemcpyDefault. Передача cudaMemcpyDefault рекомендуется, если в качестве значения указывается тип переноса, в качестве которого указывается тип переноса. Однако cudaMemcpyDefault разрешено только в системах, поддерживающих унифицированную виртуальную адресацию. Вызов cudaMemcpy () с dst и src указателями, которые не соответствуют направлению копирования, приводит к неопределенному поведению.

, а затем

cudaDeviceSynchronize()

CUDA Doc: Блокирует до тех пор, пока устройство не выполнит все предыдущие запрошенные задачи. cudaDeviceSynchronize () возвращает ошибку в случае сбоя одной из предыдущих задач. Если для этого устройства был установлен флаг cudaDeviceScheduleBlockingSync , поток хоста будет блокироваться до тех пор, пока устройство не завершит свою работу.

Теперь я попытался поместить оператор печати в конец ядрафункция

my_kernel_func(){
 doing some tasks utilizing multiple threads
 print D
}

а также распечатывается в разных местах последовательного потока:

cudaGetLastError()
print A
cudaMemcpy()
print B
cudaDeviceSynchronize()
print C

Эта вещь печатается в следующем порядке

A
D
B
C 

В основном,Мне нужно время, когда ядро ​​выполнит свою задачу. Теперь я смущен, чтобы взять время окончания. Потому что на копирование данных должно уйти много времени. Теперь, если после этого я поставлю отметку времени окончания, она также может включать время копирования.

Есть ли какая-либо другая функция для определения окончания?

1 Ответ

1 голос
/ 27 октября 2019

Как указано в документации, cudaMemcpy () демонстрирует синхронное поведение, поэтому cudaDeviceSynchronize () превращается в неработоспособность, поскольку синхронизация была выполнена в memcpy.

cudaGetLastError () проверяет, правильно ли вы вызываете ядро.

Если вы хотите использовать время для ядра, а не для memcpy, переключите порядок cudaMemcpy () / cudaDeviceSynchronize (), запустите таймер непосредственно перед вызовом ядра, затем получите значение таймера после вызова cudaDeviceSynchronize (). Обязательно проверьте также результат вызова cudaDeviceSynchronize ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...