#c #opencl
В описании этого коммита сказано: In amdgcn target, null pointers in global, constant, and generic address space take value 0 but null pointers in private and local address space take value -1. Зачем в AMD GCN так сделано?
Ответы
Ответ 1
Во-первых, значение нулевого указателя (null pointer value) по сути своей должно быть таковым, чтобы оно "указывало" на заведомо неиспользуемый адрес памяти. По-видимому в локальном адресном пространстве адрес 0x00000000 - вполне используемый адрес, т.е. подходящим внутренним представлением для null pointer он не является. Во-вторых, обратите внимание на аккуратное и грамотное использование терминологии автором прилинкованного текста. Речь идет о "null pointer" и "null pointer value", а не о NULL. NULL в тексте не упоминается вообще. Макро NULL - это null pointer constant. Его менять совершенно не нужно, да и нельзя. Он как был, так и остается именно нулевым, как того требует стандарт языка. Ненулевого NULL в языке С быть не может. Меняется только внутреннее представление null pointer value в локальном адресном пространстве. То есть меняется то значение, которое фактически получает указатель, которому присвоена null pointer constant. Неявная трансляция константного нуля в это внутреннее значение - задача компилятора. Другими словами, после данного изменения код вроде i32 addrspace(0)*p = 0; для указателя в локальном адресном пространстве будет тихонько транслироваться компилятором в занесение значения 0xFFFFFFFF в p. На уровне исходного кода исправлять нули на что-то другое не нужно.Ответ 2
Необходимо понять, что NULL не имеет никакого отношения к нулевому адресу. NULL - это лишь универсальное определение невалидного указателя. Для того, чтобы понять, почему сделано именно так, нужно знать внутреннее устройство адресного пространства GCN. Просматривая whitepaper GCN, можно найти следующее заявление: In tandem with cache coherency, GCN introduces virtual memory through a combination of hardware and driver support. <...> More importantly, it paves the way for a single address space that is seamlessly shared by CPUs and GPUs. Следовательно, адресное пространство в GCN является общим для CPU и GPU и можно предположить, что нулевой адрес является валидным адресом для данной схемы. Если это так, то значение невалидного указателя не может быть нулевым, чтобы не совпадать с валидным адресом в памяти.
Комментариев нет:
Отправить комментарий