tools_builder-russian.tex 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. \subsection{Полный цикл сборки}
  2. \index{OpenCL сборщик}%
  3. \index{oclh_br@\texttt{oclh\_br}}%
  4. Полный цикл сборки осуществляется утилитой \verb|oclh_br|.
  5. \subsubsection{Синопсис}
  6. \begin{CodeParWithCC}{\\\{\}}
  7. oclh_br [--dev-idxs=\underline{\smash{\textit{#}}},\underline{\smash{\textit{#}}},... | --dev-name=\underline{\smash{\textit{mask}}}]
  8. [--verbatim-output-name] [-o \underline{\smash{\textit{outfile}}}]
  9. [COMPILER_OPTIONS] [LINKER_OPTIONS] \underline{\smash{\textit{infile}}}...
  10. \end{CodeParWithCC}
  11. \subsubsection{Описание}
  12. При вызове \verb|oclh_br| осуществляется полный цикл сборки (компиляция и
  13. компоновка) исходного кода из файлов \verbIU{infile}\verb|...| для всех
  14. доступных в системе устройств GPGPU. Если указан ключ
  15. \verb|--dev-idxs=|\verbIU{\#}\verb|,|\verbIU{\#}\verb|,...|, то будет
  16. осуществлена сборка только для устройств с индексами
  17. \verbIU{\#}\Verb|,|\verbIU{\#}\Verb|,...|
  18. (подробнее~см.~п.\ref{subsubsec:br_args}). Если указан ключ
  19. \verb|--dev-name=|\verbIU{mask}, то будет осуществлена сборка только для
  20. устройств, модель которых соответствует маске \verbIU{mask}
  21. (подробнее~см.~п.\ref{subsubsec:br_args}).
  22. \begin{ImpNote}
  23. На первый взгляд использование сборщика выглядит предпочтительнее раздельных
  24. компиляции и компоновки, так как позволяет из исходных кодов получить
  25. исполняемые файлы сразу для всех устройств OpenCL. Однако, есть нюансы, которые
  26. связаны с тем, что работа сборщика определяется библиотекой производителя
  27. устройства OpenCL. Так при тестировании были выявлены следующие проблемы:\par
  28. {\NmCnvDescript\noindent(1) не все сборщики поддерживают создание библиотек,
  29. большинство из них создают исполняемый файл, поэтому для создания именно
  30. библиотеки надо использовать именно компоновщик с ключом \verb|-create-library|
  31. (согласно актуальной спецификации OpenCL);\par}
  32. {\NmCnvDescript\noindent(2) некоторые сборщики по неясной причине игнорируют
  33. объявление функции и интерпретируют только её определение, что приводит к
  34. необходимости в списке файлов с исходными кодами \verbIU{infile}\verb|...|
  35. указывать файлы с определением функции строго до первого использования функции,
  36. несмотря на декларацию функции в заголовках.\par}
  37. \noindent Возможно есть или появятся другие подводные камни при использовании
  38. сборщиков производителей, поэтому рекомендуется использовать раздельные
  39. компиляцию и компоновку.
  40. \end{ImpNote}
  41. Во время работы \verb|oclh_br| ведётся подробный диагностический журнал в
  42. файле \verb|oclh_br.log|, куда сохраняется избыточная информация обо
  43. всех доступных устройствах GPGPU, используемых платформах и созданных для
  44. сборки контекстах. Формат файла-журнала описан в п.\ref{subsec:logformat}.
  45. Так как сборка может осуществляться для нескольких устройств разных
  46. производителей, журнал сборки программы ведётся в отдельных файлах
  47. \verbIU{outfile}\verb|-|\verbI{модель\_устройства\_GPGPU}\verb|-build.log|.
  48. Результат работы сборщика -- исполняемый двоичный файл сохраняется с именем
  49. \verbIU{outfile}\verb|-|\verbI{модель\_устройства\_GPGPU}\verb|.clexe|. Если
  50. указан ключ \verb|--verbatim-output-name|, то результат будет сохранен в файле
  51. \verbIU{outfile}. Иногда возникает ситуация, когда библиотека OpenCL
  52. производителя устройства выдала в качестве результата несколько двоичных блоков,
  53. в таком случае все двоичные блоки будут сохранены, но к именам файлов будет
  54. добавлен постфикс \verb|.|\verbI{N}, где \verbI{N}~--~десятичное число
  55. обозначающее порядковый номер (начиная с ноля) двоичного блока сформированного
  56. компилятором производителя устройства GPGPU. Введение в имя файла данного числа
  57. связано с тем, что при реализации OpenCL производители свободны в выборе формата
  58. вывода скомпилированной программы. Так, например, реализация от Intel создаст и
  59. выведет двоичный блок, который является ELF-файлом; а реализация OpenCL от
  60. NVidia выведет текстовый человекочитаемый блок ptx-кода (вариация Ассемблера для
  61. GPGPU, также называемый IR/IL~--~Intermediate Representation/Intermediate
  62. Language). Причём иногда могут быть сформированы несколько двоичных блоков с
  63. разным содержанием. Узнать до сохранения, что именно содержится в двоичном
  64. блоке, средствами OpenCL не представляется возможным, поэтому двоичные блоки
  65. просто нумеруются по \verbI{N} в порядке их хранения в памяти данной реализацией
  66. OpenCL.
  67. Если ключ \verb|-o| не указан, то \verbIU{outfile} в названии файла будет
  68. заменён на подстроку вида \verb|program_0x|\verbI{HHHH}. В случае если модель
  69. устройства GPGPU средствами OpenCL определить не удалось, тогда
  70. \verbI{модель\_устройства\_GPGPU} будет заменена на подстроку вида
  71. \verb|dev_0x|\verbI{HHHH}. В приведённых подстановках \verbI{HHHH} это
  72. шестнадцатеричное представление последних двух байт адресов программы и
  73. устройства GPGPU, соответственно. Так как для одного запуска адрес программы и
  74. устройства GPGPU уникален, с большой вероятностью два последних байта также
  75. уникальны, поэтому могут быть использованы как подстрока для поиска связанных
  76. записей в файле основного журнала \verb|oclh_br.log|.
  77. Имя файла основного журнала \verb|oclh_br.log| и пути сохранения файлов могут
  78. быть изменены при сборке библиотеки OpenCL helpers в заголовочном файле\\*
  79. \indent\indent\verb|src/inc/oclh_settings.h|\\*
  80. Данное имя и пути сохранения журналов и результатов компиляции определены в
  81. макросах\\*
  82. \indent\indent\verb|#define _GHM_LOG_PATH "."|\\*
  83. \indent\indent\verb|#define _GHM_OCLH_BUILDER_LOG_FILENAME "oclh_br.log"|
  84. Сборщику всегда передаётся аргумент \verb|-D_OCLH_OCL_COMPILER_|. Он
  85. прописан в коде библиотеки и введён для возможности использования заголовочных
  86. файлов как в программах для GPGPU, так и для CPU без их изменения. Подробнее см.
  87. п.\ref{subsec:sharedheaders}.
  88. \subsubsection{Аргументы}
  89. \label{subsubsec:br_args}
  90. {\NmCnvDescript\verb|--dev-idxs=|\verbIU{\#}\Verb|,|\verbIU{\#}\verb|,...|\\*
  91. числа \verbIU{\#}\verb|,|\verbIU{\#}\verb|,...|, указанные без пробелов через
  92. запятую после ключа \verb|--dev-idxs=| это порядковые номера (индексы) устройств
  93. GPGPU в системе, для которых будет осуществлена сборка. Индексы начинаются с
  94. ноля. Узнать индекс конкретного устройства можно из файла-журнала, в начальной
  95. секции которого в описании устройства самая первая строка имеет вид\par
  96. {\hspace{2\leftskip}\verbI{YYYY}\verb|-|\verbI{MM}\verb|-|\verbI{DD}%
  97. \verb| |\verbI{hh}\verb|:|\verbI{mm}\verb|:|\verbI{ss}%
  98. \verb| ws_0x|\verbI{HHHH}\verb| dev_0x|\verbI{HHHH}%
  99. \verb+ | Device index: +\verbI{N}},\par
  100. \noindent где \verbI{N} -- индекс данного устройства.\par}
  101. {\NmCnvDescript\verb|--dev-name=|\verbIU{mask}\\* строка \verbIU{mask},
  102. указанная после ключа \verb|--dev-name=| это маска, которая указывает для каких
  103. моделей устройств, присутствующих в системе будет осуществлена сборка.
  104. Символами подстановки являются:\par
  105. \hspace{2\leftskip}\verb|?| -- замещает один любой символ;\par
  106. \hspace{2\leftskip}\verb|*| -- замещает любое количество любых символов.\par
  107. \noindent При отсутствии символов подстановки \verbIU{mask} рассматривается как
  108. точное наименование модели устройства. Узнать модель конкретного устройства
  109. можно из файла-журнала, в начальной секции которого в описании устройств
  110. присутствует строка вида\par
  111. {\hspace{2\leftskip}\verbI{YYYY}\verb|-|\verbI{MM}\verb|-|\verbI{DD}%
  112. \verb| |\verbI{hh}\verb|:|\verbI{mm}\verb|:|\verbI{ss}%
  113. \verb| ws_0x|\verbI{HHHH}\verb| dev_0x|\verbI{HHHH}%
  114. \verb+ | Device name: +\verbI{модель}}\par
  115. \noindent где \verbI{модель}~--~и есть строка, которая проверяется на
  116. соответствие маске \verbIU{mask}.\par}
  117. {\NmCnvDescript\verb|--verbatim-output-name|\\* данный ключ предписывает
  118. сборщику не добавлять к имени выходного файла модель устройства и расширение,
  119. а использовать его именно так как указано. Однако, в случае если результатом
  120. работы сборщика является не один двоичный блок, то к имени будет добавлен
  121. постфикс \verb|.|\verbI{N}, где \verbI{N}~--~десятичное число обозначающее
  122. порядковый номер (начиная с ноля) двоичного блока сформированного сборщиком
  123. производителя устройства GPGPU.\par}
  124. {\NmCnvDescript\verb|-o |\verbIU{outfile}\\* строка \verbIU{outfile}~--~имя
  125. выходного файла. Если не задан ключ \verb|--verbatim-output-name|, то
  126. \verbIU{outfile} используется как префикс имени файла \verbIU{outfile}\verb|-|%
  127. \verbI{модель\_устройства\_GPGPU}\verb|.clexe|, содержащего двоичный блок кода
  128. сформированный в результате сборки. В случае, если ключ
  129. \verb|--verbatim-output-name| указан, то \verbIU{outfile} используется <<как
  130. есть>>, за исключением случаев, когда в результате сборки сформированы
  131. несколько двоичных блоков~--~в таком случае все двоичные блоки будут сохранены с
  132. именами файлов \verbIU{outfile}\verb|.|\verbI{N}, где \verbI{N}~--~порядковый
  133. номер двоичного блока начиная с ноля. Кроме того строка \verbIU{outfile} будет
  134. использована как префикс в имени файла-журнала сборки.\par
  135. \begin{ImpNote}
  136. Пробельные символы в начале и в конце строки \verbIU{outfile} будут удалены.
  137. Пробельные символы внутри строки \verbIU{outfile} будут заменены на знак
  138. подчёркивания~<<\verb|_|>>~(underscore).
  139. \end{ImpNote}
  140. }
  141. {\NmCnvDescript\verb|COMPILER_OPTIONS|\\* аргументы компилятора. В неизменённом
  142. виде и с сохранением последовательности передаются сборщику производителя.
  143. Сами аргументы компилятора описаны в спецификациях OpenCL, кроме того,
  144. сборщик производителя может поддерживать дополнительные аргументы не
  145. отражённые в спецификациях OpenCL.\par}
  146. {\NmCnvDescript\verb|LINKER_OPTIONS|\\* аргументы компоновщика. В неизменённом
  147. виде и с сохранением последовательности передаются сборщику производителя. Сами
  148. аргументы компоновщика описаны в спецификациях OpenCL, кроме того, сборщик
  149. производителя может поддерживать дополнительные аргументы не отражённые в
  150. спецификациях OpenCL.\par}
  151. {\NmCnvDescript\verbIU{infile}\verb|...|\\* список разделённый пробелами с именами файлов содержащих исходный код программы OpenCL C или OpenCL C++. Имя файла не может начинаться с символа~<<\verb|-|>>.\par}