2016-12-12 2 views
0

This commit говорит:Почему AMD GCN использует ненулевой NULL?

В amdgcn цели, нулевые указатели на глобальном, постоянная, и общем адресном пространстве значения тека 0, но нулевые указатели в частном и локальном адресное пространство принимает значение -1.

Как они используют эти два разных значения NULL?

+2

Стандарт C приложил все усилия, чтобы сделать NULL неотличимым от целого 0 и логического значения false, но не упоминает, что он должен быть 0 на уровне машинного кода. Я предполагаю, что в этих адресных пространствах 0 зарезервирован действительный адрес. – user3528438

+1

Ваш вопрос непонятен. Название спрашивает «почему?». и текст спрашивает «как?»; «Как», по-видимому, подробно объясняется в коммите, если вы не имеете в виду «Как это может быть допустимо C?», Что является еще одним вопросом. Пожалуйста, будьте более конкретными. – rici

+0

Я долго работал на машине, где null был 0xffffffff (т.е. -1). Мне показалось странным прийти в систему, где 0 == null. Я имею в виду, что 0 - это абсолютно правильный адрес, его первый байт ОЗУ. – pm100

ответ

0

Что касается Почему: Я не знаю этого, но локальные/частные адресные указатели пространства почти наверняка реализованы как смещения/индексы в плоском физическом регистровом файле/области памяти. Нет переопределения виртуальной памяти, например, большого массива. Вы по-прежнему хотите иметь доступ к массиву index 0, поэтому «неверный указатель» (недопустимый индекс) должен быть чем-то другим.

Не забывайте, NULL = не разыменовываемое указатель = 0 просто конвенции в обычном C, также - в некоторых системах, не OpenCL также имеют действительную память по адресу 0. Там какое-то осложнение в стандартном отношении MemSet и так далее, так что вам, вероятно, лучше всего прочитать документ самостоятельно, если вас интересует точная спецификация.

Я не уверен, что именно вы просите относительно «как» - вы не можете разумно конвертировать между указателями в разных пространствах OpenCL, поэтому там нет конфликта.

Смежные вопросы