Но как понять преобразование из half*
в unsigned long long*
?
В указанном вами коде нет преобразования в unsigned long long *
. Существует преобразование в unsigned long long
.
Целью преобразования является преобразование адреса, хранящегося в одном из A
, B
, C
или D
, в целое число, чтобы его биты могут быть исследованы. Стандарт C не определяет результат преобразования указателя в целочисленный тип, за исключением некоторых базовых c свойств, но преобразование «должно соответствовать структуре адресации среды выполнения» (C 2018 сноска 69). В компиляторе, который использует Nvidia, преобразование предположительно создает адрес, который обычно используется архитектурой процессора. Затем с помощью % 128 == 0
проверяется, совпадает ли адрес с кратным 128 байт.
Почему сначала нужно преобразовать в unsigned long long*
, а затем проверить, выровнена ли память по 128?
Оператор %
не будет принимать операнд-указатель, поэтому операнд должен быть преобразован в целочисленный тип, unsigned long long
, а не unsigned long long *
.