All streams
Search
Write a publication
Pull to refresh
8
0
Антон Вдовиченко @avdx

Программист

Send message
Мы в свое время расматривали возможность аренды серверов с видеокартой, для вебсервиса с поддержкой воксельного рендера. Выглядит это вот так:

Для работы нужна поддержка как минимум OpenCL с поддержкой CL_MEM_OBJECT_IMAGE3D, а лучше CUDA. Но тут основные требования именно к объему видеопамяти. Одна такая моделька, как в видео, требует 300Мб, а бывают модельки и побольше. А предполагалось, что один сервер будет обслуживать несколько клиентов одновременно. 1Gb видеопамяти — это практически минимум для одного клиента.
Почему это инструкция странная? Когда работаешь с битовыми массивами/картами, подсчет количества бит очень популярная задача. Конечно использование 8-битных lookup таблиц или RLE кодирование с использованием intrinsic'ов __builtin_ctz()/_BitScanForward() (для разреженных данных) не сильно медленнее, но все равно инструкция полезная.
Как я понимаю, это вот эта задача:
https://ru.wikipedia.org/wiki/Задача_о_сумме_подмножеств
Она NP-полная. В статье приводятся имеющиеся алгоритмы решения. В том числе есть предлагается решения генетическими алгоритмами:
Решение задачи о сумме подмножеств
Задание передаточной функции в конечном итоге соответствует просто выбору диапазона(ов) плотности. Как видно из текста статьи, задание диапазонов/порогов используется в качестве отдельных этапов алгоритма и целиком задачу не решает.
Про нарушение законов физики вообще речь не шла. Не знаю, как это может следовать из моего вопроса.
Про детерменированность — имелось ввиду в классическом смысле. Просто, насколько я знаю, существует несколько версий природы сознания: в частности квантовая это природа или классическая. И тогда, если природа квантовая (выбор зависит от состояния квантовой системы в суперпозиции), то получается, что согласно ММИ, выбор порождает несколько миров, соответствующие каждому варианту выбора, т.е. каждый вариант реализуется в своем мире. А если природа классическая, то реализуется только один предопределенный вариант.
Насколько я понимаю, образование нового мира происходит в результате декогеренции квантовой системы, находящейся в состоянии суперпозиции. Т.е. возможны не все варианты миров, а только такие, которые являются следствием перехода какой-либо квантовой системы в одно из состояний?
Если так, то такой вопрос. Допустим я выбираю действие из двух одинаково предпочтительных вариантов. Тогда, если мой выбор зависит от состояния какой то квантовой системы, то будет два мира, где реализуется каждый из вариантов. А если не зависит, то будет только один какой то вариант и в этом случае сознание/воля получаются полностью детерменированными?
Делал подобное лет 10 назад, использовал практически все те же оптимизации, правда оптимизацией под L2/L3 уже не заморачивался, прирост не особо большой от этого получался. Результатами до сих пор пользуюсь — библиотека получилась небольшой, не надо что-то стороннее тянуть большое.
Но все-таки умножение матриц это достаточно простая вещь. Вот сделать то же самое для обращения матрицы (LUP разложения) и распараллелить обращение было посложнее.
Не понял, что именно подтверждает ваши слова.
Видимо у вас есть непонимание, что КТ исследования сильно различаются, в зависимости от задачи, ради которой они выполняются. И исследование выполненное для Calcium scoring нельзя использовать для КТ ангиографии и наоборот. Иначе я не понимаю, как невозможность использования исследования calcium scoring для обнаружения стенозов и бляшек, относится к возможности проведения КТ ангиографии.
Я привёл конкретный пример отсюда

Исследование, которое вы привели, это Calcium scoring(Индекс кальция). Оно так и выполняется — без контраста и на низкой энергии для уменьшения дозы. Оно предназначено только для вычисления общего объема кальция в коронарных артериях, на основе которого, а также пола и возраста пациента вычисляется процент коронарного риска. Для обнаружения стенозов и других патологий коронарных сосудов это исследование не предназначено.
скажите пожалуйста на какой поверхности сосуда, согласно данным приведённого вами снимка расположены поражения — на боковой, на верхней, на нижней, на нескольких, а может оно цилиндрическое?

Приведенная мною картинка всего лишь одна проекция развертки сосуда. Развертку сосуда можно анализировать во всех проекция, анализировать поперечные срезу, 3D реконструкцию сосуда. Все это дает достаточно информации о геометрии просвета и бляшек, а также их положении.
Картинка, что вы привели, явно получена не в результате КТ коронарографии. Исследование выполнено:
1. Для всего тела, а не только области сердца.
2. Без контраста.
3. С низким уровнем энергии. Это снижает дозу, но усиливает артефакты реализации преобразования Радона, которые Вы назвали «вектора рентгеновских лучей».
Вот так выглядит один срез исследования КТ коронарографии:

А вот так выглядит развертка сосуда:

Как видно, кальцификация отличается от «мягкого» стеноза.
На чём основаны все эти ваши утверждения относительно КТ?

На опыте наблюдения за работой специалиста, выполнявшего подобную процедуру.
преимуществом КТ является хорошая визуализация твёрдых образований и металлов, поэтому сомнительный спектр их диагностической эффективности при работе с коронарными сосудами ограничен.

КТ ангиография всегда выполняется с контрастом. Это относится и к коронарным сосудам. Контрастированная кровь, которая и определяет просвет, явно отличается от окружающих тканей, как рентгеновски более «мягких», так и более «твердых». Визуализация просвета позволяет определить его сужение также, как и при коронарографии. При этом, чем вызвано это сужение, в большинстве случаев можно сказать достаточно определенно. Тип бляшки также в большинстве случаев можно определить как по прямым, так и по косвенным признакам. При коронарографии, насколько я понимаю, определить тип бляшки невозможно.
Оценить артефакт это, мягкая бляшка, стеноз, твёрдая бляшка без кальцификации или пристеночный тромб — обычный оператор как правило будет не в состоянии

Оператор только выполняет саму процедуру КТ. Анализ сосудов выполняет квалифицированный специалист. Он это делает на отдельной рабочей станции, не привязанной к томографу. Т.ч. на одного такого специалиста может одновременно приходиться несколько операторов. В этом и смысл разработки ПО не привязанного к станции томографа.
Как вы себе представляете КТ скрининг?

Имелась ввиду понятное дело группа риска. Т.е. те, у кого уже есть какие то показания, но на коронарографию прямых показаний нет. Доза это конечно да. Не скажу насколько она велика для данного типа КТ, но в любом случае прогресс не стоит на месте и есть надежда, что по мере развития технологий доза будет уменьшаться.
Если пациент поступает экстренно, никакие КТ/МРТ никто не делает

Речь не идет про экстренных, понятное дело.
Почему это КТ не может обнаруживать мягкие бляшки? Жир также отличается от контраста, как и кальций.
Насчет преимуществ именно КТ. Коронарография выполняется, как я понимаю, кардиохирургом. КТ может выполнить простой оператор. Поэтому эта процедура более доступна, может даже выполняться в перспективе как скрининговая.
К тому же коронарография это инвазивная процедура, фактически это операция на сердце, и есть определенный риск связанный с введением катетеров в коронарные артерии. КТ практически неинвазивно. Понятно, что тоже нужно вводить контраст, но для этого не нужно лезть в аорту и дальше в коронарные артерии.
Насчет FormatMessage(). Как написано в описании флага FORMAT_MESSAGE_ALLOCATE_BUFFER в этом случае нужно передавать не адрес буфера, а адрес указателя, куда будет помещен адрес буфера. Т.е. нужно передавать не message, а (LPTSTR)&message. В этом ошибка.
По моему опыту, не имеет смысл использовать shared memory в большинстве задач, потому что просто нечего там хранить: прочитал элемент из global или текстуры, обработал, сохранил туда же или в другой буфер.
Классическим примером, где нужно использование shared, является перемножение матриц, там это дает большое ускорение, но это весьма специфический пример.
В своих задачах я использую shared memory в основном при всякой редукции, тут она нужна чисто для обмена данными между потоками в блоке. Но для этого в той же CUDA есть и другие механизмы, можно обойтись и без нее.
Еще shared memory нужна, когда каждому потоку нужен какой то локальный буфер для своих вычислений. Но здесь размер буфера получается весьма ограничен, да и честно сказать это не очень эффективно. Если в задаче требуется буфер, то обычно ее достаточно сложно реализовать на gpu.
Больше что-то ничего не приходит в голову, для чего может shared memory понадобиться. Скорее в остальном это специфические задачи.
На самом деле задач, где имеет смысл использование shared памяти на gpu не так уж много. Nvidia в свое время сделало кэширование global памяти, такое же как в обычных процессорах, но потом в один прекрасный момент молча это выпилили. В результате производительность в конкретной задаче конкретно просела. В замен они добавили специальную инструкцию, для чтения глобальной памяти, которая гарантировала попадание данных в кэш. Но только это работало для константных данных и следить за тем, чтобы они не менялись должен был сам разработчик.
Речь вроде была о влиянии точности вычислений на сходимость алгоритма построения таблиц. Причем тут вообще ГСЧ? В построении таблиц он никак не участвует.
Речь о realtime сигналах (sig >= SIGRTMIN) путем установки:
fcntl(fd, F_SETSIG, sig)
для дескриптора
и последующем получении информации об I/O событиях через sigwaitinfo()/sigtimedwait()
Здесь как раз отсутствуют проблемы poll()/select() выраженные в квадратичной сложности от количества сокетов. А realtime сигналы избавлены от проблем обычных сигналов.
В свое время (10 лет назад) реализовывал на этом сервер. Все работало без проблем.
Корень проблемы в том, что maxCharsPerByte() возвращает float. Почему так сделано я не знаю, но видимо это не обсуждается. В результате при умножении результата maxCharsPerByte() на int происходит умножение int на float. При арифметической операции с операндами разного типа оба операнда приводятся к тому типу, который может представить больший диапазон чисел, в данном случае это float. Но т.к. у float разрядность мантиссы 24 бита, а у int разрядность 32 бита, при привидении int к float сохраняются только 24 старших значащих бита, а младшие обнуляются, также если результат умножения получается больше 2^24, то его младшие биты тоже теряются. В итоге результат умножения получается меньше, чем должен быть в точной арифметике.
На мой взгляд нормальным исправлением должно бы было быть изменение возвращаемого типа maxCharsPerByte() на целый, но видимо это невозможно по каким то причинам, поэтому приведение к double вполне корректное решение.
Видимо проблема проявляется только под нагрузкой, возможно когда из-за этого процессор повышает тактовую частоту. Я думаю стоит попробовать ограничить или уменьшить максимальную частоту процессора и посмотреть будет ли повторяться проблема.
В любом случае других разумных объяснений, кроме ошибки процессора не вижу.
А другие приложения, использующие floating point, не глючат на этой машине?

Information

Rating
6,313-th
Registered
Activity