Программирование на видеокартах GPGPU (1184391), страница 12
Текст из файла (страница 12)
Это значит, что болееконкретные типы следует располагать перед более общими. Кроме того, расположениевизуализаторов "впереди" позволяет заменять уже существующие правила — собственными,причём без какого-либо удаления существующих.Вроде бы можно также расположить свой собственный файл, начинающийся со строки[Visualizer], в произвольном месте и указать его местоположение в переменнойокружения _vcee_autoexp, однако это не проверялось.Описание вида отображения величин какого-либо типа (или нескольких сходных типов)начинается с имени этого типа (или нескольких типов, разделяемых вертикальной чертой). Далееследуют поименованные блоки с выражениями в круглых скобках.
Эти выражения определяют,как показываются величины упомянутых типов в разных ситуациях.44Условная схема описания выглядит так (здесь квадратные скобки обозначают необязательнуючасть заголовка, а многоточие – возможность повторения):ИмяТипа[|ИмяТипа...] {preview (ВыражениеСтрокиПредварительногоПросмотра)stringview (ВыражениеВизуализатораТекста)children (ВыражениеРазворачиваемогоСодержимого)}Никакие выражения не являются обязательными, однако блоки preview и children частоприсутствуют вместе.
Можно описывать также шаблонные типы, используя синтаксис полногосовпадения ИмяТипа<*> или частичного совпадения ИмяТипа<КонкретныйТип, *> и т.п.Параметры шаблона далее можно использовать под именами $T1, $T2 и т.д., $e — значениевизуализируемой переменной.ВыражениеСтрокиПредварительногоПросмотра (блок preview) состоит из однойстроки, выводимой в окошках Watch, QuickWatch, Command Window. Квадратные скобки в нейиспользуются для того, чтобы вместе с выражением, значение которого будет выведено, указать иформатирующий спецификатор.
Поскольку одного выражения обычно недостаточно, лучшеиспользовать обрамление #( и ) для списка (разделяемого запятыми) строк и выражений.Блок children тоже содержит либо одно выражение, либо список выражений через запятую вобрамлении #( и ).Некоторые синтаксические конструкции autoexp.datНаиболее часто используемые синтаксические конструкции в таких описаниях – это условныйоператор (с одним или несколькими условиями), переключатель (в котором отдельные случаисодержат константные выражения), а также оператор конкатенации.Условный оператор#if ( ... )(Условный операторс несколькими условиями. . .#if ( ... )(. . .)#elif ( ...
)()#else(Переключатель#switch( ... )#case K1(. . .)Оператор конкатенации#(..., ..., ..., . . . ...). . .)#case K2(. . .)#else(. . .). . .. . .)#default(. . .)45Для того, чтобы освоиться с синтаксисом оформления визуализаторов, полезно посмотреть ужеимеющиеся в этом файле для каких-нибудь общеизвестных типов данных.
Вот, например,фрагмент, касающийся отображения комплексных величин:;-----------------------------------------------------------------------------; std::complex;-----------------------------------------------------------------------------std::complex<*>{children(#(real: $e._Val[0],imaginary: $e._Val[1]))preview(#if($e._Val[1] != 0)(#if ($e._Val[0] != 0)(; Real and Imaginary components#if ($e._Val[1] >= 0)( #($e._Val[0],"+i*", $e._Val[1]))#else( #($e._Val[0],"-i*", -$e._Val[1])))#else(; Purely imaginary#if ($e._Val[1] >= 0.0)( #("i*", $e._Val[1]))#else( #("-i*", -$e._Val[1]))))#else(; Purely real$e._Val[0]))}Кроме того, в тексте визуализаторов могут встречаться более сложные конструкции: #array (.
. . ), #list ( . . . ), #tree ( . . . ), на которых мы здесь останавливаться небудем, отметим лишь, что с их использованием появляются новые переменные для выражений:$i, $c, $r.Visual Studio 2012Начиная с Visual Studio 2012 введён другой формат описания визуализаторов в отладчике: онипомещаются в XML-файлы с расширением .natvis, при этом поддерживаются множественныефайлы визуализаторов. Располагаться такие файлы могут в следующих местах:• %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers(требуются административные права!)• %USERPROFILE%\My Documents\Visual Studio 2012\Visualizers\• Каталоги VS-расширений46Пример содержимого .natvis-файла:<?xml version="1.0" encoding="utf-8"?><AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><Type Name="CPtrArrayT<*>"><DisplayString>{{CPtrArray m_nSize={m_nSize}}}</DisplayString><Expand><Item Name="m_nSize">m_nSize</Item><Item Name="m_nMaxSize">m_nMaxSize</Item><Item Name="m_nGrowBy">m_nGrowBy</Item><IndexListItems><Size>m_nSize</Size><ValueNode>($T1*)m_pData[$i]</ValueNode></IndexListItems></Expand></Type></AutoVisualizer>Видно, что его содержание примерно соответствует старым описаниям, но оформляется подругому.Интересные и/или полезные ссылки по темеVisualizershttp://msdn.microsoft.com/en-us/library/zayyhzts.aspxСтатья из библиотеки MSDN; интересна тем, что это всё-таки информация хотя инедостаточная, но от разработчика...Writing custom visualizers for Visual Studio 2005http://www.virtualdub.org/blog/pivot/entry.php?id=120Одна из первых и наиболее часто цитируемых статей, в которой подробно описаны(недокументированные) свойства файла autoexp.dat.How to fix debugger visualizers for VS2005 SP1 and VS2008http://virtualdub.org/blog/pivot/entry.php?id=172Watch out for number bases in Visual C++ visualizershttp://virtualdub.org/blog/pivot/entry.php?id=302Другие заметки этого же автора на рассматриваемую тему.OpenCV debugger visualizers for Visual Studiohttps://bitbucket.org/sergiu/opencv-visualizersНабор визуализаторов для популярной библиотеки компьютерного зрения OpenCV,упоминаемой в курсе ранее.
Включает показ ключевых типов cv::Mat|cv::Mat_<*> иcv::gpu::GpuMat (наиболее интересных для нас), а также других (cv::Vec<*,*>,cv::Point_<*>, cv::Rect_<*>, cv::Scalar_<*>, cv::Ptr<*> и пр.)About Debugger Visualizershttps://svn.boost.org/trac/boost/wiki/DebuggerVisualizersПриведены визуализаторы для упоминавшейся ранее библиотеки Boost (описаны типыboost::array, boost::ptr_vector, boost::ptr_array, boost::ptr_deque,boost::ptr_list, boost::ptr_map, boost::ptr_set и многие другие).47Visual Studio Debug Visualizer For Half Floatshttp://www.reedbeta.com/blog/2013/02/06/visual-studio-debug-visualizer-forhalf-floats/Визуализатор для вещественных величин, занимающих два байта (т.н.
формат half float).half{preview(#if (($e._h & 0x7c00) == 0x7c00) (#if (($e._h & 0x03ff) == 0) (#if ($e._h & 0x8000) ("-inf") #else ("+inf")) #else (#if ($e._h & 0x0200) ("qNaN") #else ("sNaN"))) #else (#if (($e._h & 0x7c00) == 0) (; Denormal or zero[($e._h & 0x03ff) / 16777216.0 * (($e._h >> 0xf) * -2.0 + 1.0), g]) #else (; Normal float (condensed to avoid length problem)[(1<<(($e._h&0x7c00)>>0xa))/32768.0*(1.0+($e._h&0x03ff)/1024.0)*(($e._h>>0xf)*-2.0+1.0),g])))}Автор статьи тестировал код в Visual Studio 2008 и 2010 и обнаружил, что, по-видимому, естьограничение на число символов в квадратных скобках (около сотни символов); это влияет наокно с локальными переменными (но не на Watch-окно). Кроме того, он обнаружил, что есливключён шестнадцатиричный режим в отладчике, то все целые числа воспринимаются какшестнадцатиричные, что вынудило его в тексте визуализатора записывать их именно так.How to Write Native C++ Debugger Visualizers in Visual Studio for Complicated Typeshttp://www.idigitalhouse.com/Blog/?p=83Частный пример построения визуализатора для строки, находящейся глубоко в иерархии(с подробными пояснениями и иллюстрациями получаемых результатов).Setting up Visual Studio Debugger Visualizershttp://www.chromium.org/developers/how-tos/how-to-set-up-visual-studiodebugger-visualizersВизуализаторы для проекта известного открытого браузера Chromium.48О спецкурсе .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .Видеокарты и GPU как супервычислители . . . . . . . . . . . . . .CUDA — архитектура и программные средства . . . . . . . . . . .CUDA-программа . . . . . . . . . . . . . . . . . . . . . . .
.Иерархия нитей . . . . . . . . . . . . . . . . . . . . . . . . .Виды памяти . . . . . . . . . . . . . . . . . . . . . . . . . . .Компиляция программ . . . . . . . . . . . . . . . . . . . . .Расширения языка C в архитектуре CUDA . . . . . . . . . . . . . .Спецификаторы функций и переменных . . . .
. . . . . . .Дополнительные типы данных CUDA . . . . . . . . . . . . .Полный синтаксис запуска ядер на исполнение . . . . . . .Дополнительные математические функции . . . . . . . . . .Разделяемая память . . . . . . . . . . . . . . . . . . . . . . .Взаимодействие нитей в блоках .
. . . . . . . . . . . . . . . . . . .Адресация памяти в нитях . . . . . . . . . . . . . . . . . . . . . . .Суммирование компонент вектора — пример ядра . . . . . . . . .Умножение матриц . . . . . . . . . . . . . . . . . . . .
. . . . . . .Алгоритм параллельной сортировки Bitonic Sort . . . . . . . . . ."Косвенное" использование возможностей GPU . . . . . . . . . .Библиотеки для CUDA GPU . . . . . . . . . . . . . . . . . . . . . .Thrust: состав и возможности . . . . . . . . . . . . .