Механизм сообщения об ошибках API времени выполнения не может использоваться для кода пользовательского устройства для сообщения об ошибках.
Если вы хотите, чтобы код вашего устройства возвращал индикатор ненормального состояния, самый простой способ сделать это - объявить статическую переменную флага глобальной памяти и иметь любой поток, в котором произошла ошибка записи в этот флаг.Если вы хотите, чтобы поток прерывал ядро, вы можете сделать что-то вроде этого:
__device__ int errorflag;
__global__ void kernel()
{
// Processing code here
if (errorcondition) {
errorflag=errorcode;
__threadfence();
asm("trap;");
}
}
Это приводит к ошибке аварийного завершения, сигнализируемой из среды выполнения, с вашим состоянием ошибки, сохраненным в errorflag
.Вы можете прочитать обратно из errorflag
, используя cudaMemcpyToSymbol
в коде хоста, чтобы проверить результат.Указатель на нулевую копию памяти также может быть потенциально использован, если вы предпочитаете, и в этом случае вам нужно будет использовать вместо этого вызов __threadfence_system()
, чтобы гарантировать, что запись была сброшена на хост перед выполнением прерывания.