Это ожидаемое поведение. cudaPointerGetAttributes
может только анализировать указатели, которые были каким-то образом записаны с помощью API среды выполнения CUDA. См. документацию :
Если указатель не был размещен, отображен или зарегистрирован с контекстом, поддерживающим унифицированную адресацию, возвращается cudaErrorInvalidValue.
Это говорит о том, что указатель должен быть возвращен или передан через API, такой как cudaMalloc
, cudaMallocManaged
, cudaHostRegister
и т. Д., Чтобы он был "распознан" cudaPointerGetAttributes
. Вы должны быть в режиме UVA , и вы должны получить указатель, используя соответствующий метод.
В вашем случае, передача пустого указателя хоста таким способом не соответствует требованиям, изложенным в документации, поэтому ожидается возврат ошибки.
Этот конкретный код возврата ошибки является «нелипкой» ошибкой CUDA, то есть ее можно удалить с помощью cudaGetLastError()
. На мой взгляд, было бы безопасно интерпретировать этот код возврата ошибки как «это обычный указатель хоста». Но, конечно, если вы передадите значение мусора или нераспределенный указатель, вы получите тот же код ошибки.