?

Log in

No account? Create an account

Conflux: GPGPU для .NET - Excelsior

Sep. 26th, 2010

01:25 pm - Conflux: GPGPU для .NET

Previous Entry Share Next Entry

К моему дню рождения в августе (серьезно, прямо в ночь перед ДР =)) случилось радостное событие - наконец-то удалось допилить Конфлакс до относительно рабочего состояния. А на недавней конференции Application Developer Days 2010 мне представился шанс выступить с докладом. Конечно же, я рассказывал про Конфлакс. В честь этого радостного события приглашаю вас ознакомиться со слайдами или даже посмотреть видео. Если вы никогда не слышали про CUDA, то перед этим лучше прочитать прекрасную презентацию Саймона Грина (для начального знакомства хватит первых 14 слайдов).

Тамбнейл доклада
Просто и ёмко Конфлакс описал antilamer: "в дотнетовской программе (на шарпе, например) можно написать метод, который будет выполняться на CUDA - он в рантайме декомпилируется и перекомпилируется в CUDA PTX". Если вас это описание заинтриговало, то вот как все это можно увидеть своими глазами:
  1) Скачать демку умножения матриц на Конфлаксе.
  2) Пока демка качается, можно посмотреть краткое описание.
  3) Демка состоит из двух частей - для CPU и для GPU. Для запуска демонстрации на CPU не нужно ничего, кроме четвертого дотнета. Для запуска демонстрации на GPU нужны CUDA-видеокарта и CUDA-драйвер.
  4) Обратите внимание на артефакты, которые создает демка. Во-первых, это логи, которые выводятся на консоль. Во-вторых, это динамически генерируемый код (ассемблер NVIDIA пишется в трейс, сгенерированный IL после завершения программы сбрасывается на диск - его можно посмотреть рефлектором). В-третьих, это CFG (графы потока управления) дизассемблированных методов, использованных в кернеле.
  5) Можно скачать исходники Конфлакса и посмотреть, как все работает. Для того, чтобы открыть проект, нужна Visual Studio 2010.

В заключение несколько слов саммари. Конфлакс позволяет программисту в 100% managed коде описать параллельный алгоритм, который потом будет исполняться на GPU. Написанный алгоритм можно прозрачно дебагать, используя стандартные средства Visual Studio, одной строчкой переключившись на CPU бакэнд. Наконец, несмотря на происходящую под капотом магию, Конфлакс не является дополнительным уровнем абстракции, которая может неожиданно протечь - он всего лишь один-к-одному преобразует код на дотнете в код для GPU, в нем можно даже писать ассемблерные вставки и вызывать third-party библиотеки CUDA (например, CUBLAS или CUFFT). Все это является шагом вперед в мире GPGPU для дотнета.

Comments:

[User Picture]
From:wizzard0
Date:September 26th, 2010 12:55 pm (UTC)
(Link)
А скажи, какой клиент для hg на винде используешь?
(Reply) (Thread)
[User Picture]
From:wizzard0
Date:September 26th, 2010 01:16 pm (UTC)
(Link)
ой, ilmerge новый вышел, а я и не знал...
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 26th, 2010 02:36 pm (UTC)
(Link)
Юзаю tortoisehg. А почему спрашиваешь?
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 26th, 2010 01:25 pm (UTC)
(Link)
Падает(


ProcessModel: Default DomainUsage: None
Execution Runtime: net-4.0
Selected test: Conflux.Playground.Demo
Included categories: Hot
.

F.

F
Tests run: 2, Errors: 2, Failures: 0, Inconclusive: 0, Time: 0,49 seconds
Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0

Errors and Failures:
1) Test Error : Conflux.Playground.Demo.Tests.MatMul
System.TypeInitializationException : The type initializer for 'Conflux.Core.Configuration.Cuda.CudaConfig' threw an exception.
----> XenoGears.Assertions.AssertionFailedException : This should not happen
at Conflux.Core.Configuration.Cuda.CudaConfig..ctor()
at Conflux.Playground.Demo.Tests.Mul(Single[,] a, Single[,] b) in W:\lib\conflux\Conflux.Playground\Demo\Kernel.cs:line 19
at Conflux.Playground.Demo.Tests.MatMul() in W:\lib\conflux\Conflux.Playground\Demo\Boilerplate.cs:line 28
--AssertionFailedException
at XenoGears.Assertions.AssertionHelper.Fail() in w:\lib\conflux\ThirdPartyStuff\xenogears\xg\XenoGears\Assertions\AssertionHelper.cs:line 192
at Libcuda.CudaVersions.get_SoftwareIsa() in w:\lib\conflux\ThirdPartyStuff\libcuda\Sources\Libcuda\Libcuda\CudaVersions.cs:line 55
at Conflux.Core.Configuration.Cuda.CudaConfig..ctor() in W:\lib\conflux\Conflux\Core\Configuration\Cuda\CudaConfig.Core.cs:line 38
at Conflux.Core.Configuration.Cuda.CudaConfig..cctor() in W:\lib\conflux\Conflux\Core\Configuration\Cuda\CudaConfig.Boilerplate.cs:line 16

2) Test Error : Conflux.Playground.Demo.Tests.MatMul
System.TypeInitializationException : The type initializer for 'Conflux.Core.Configuration.Cuda.CudaConfig' threw an exception.
----> XenoGears.Assertions.AssertionFailedException : This should not happen
at Conflux.Core.Configuration.Cuda.CudaConfig..ctor()
at Conflux.Playground.Demo.Tests.Mul(Single[,] a, Single[,] b) in W:\lib\conflux\Conflux.Playground\Demo\Kernel.cs:line 19
at Conflux.Playground.Demo.Tests.MatMul() in W:\lib\conflux\Conflux.Playground\Demo\Boilerplate.cs:line 28
--AssertionFailedException
at XenoGears.Assertions.AssertionHelper.Fail() in w:\lib\conflux\ThirdPartyStuff\xenogears\xg\XenoGears\Assertions\AssertionHelper.cs:line 192
at Libcuda.CudaVersions.get_SoftwareIsa() in w:\lib\conflux\ThirdPartyStuff\libcuda\Sources\Libcuda\Libcuda\CudaVersions.cs:line 55
at Conflux.Core.Configuration.Cuda.CudaConfig..ctor() in W:\lib\conflux\Conflux\Core\Configuration\Cuda\CudaConfig.Core.cs:line 38
at Conflux.Core.Configuration.Cuda.CudaConfig..cctor() in W:\lib\conflux\Conflux\Core\Configuration\Cuda\CudaConfig.Boilerplate.cs:line 16

(Reply) (Thread)
[User Picture]
From:xeno_by
Date:September 26th, 2010 02:44 pm (UTC)
(Link)
>>at Libcuda.CudaVersions.get_SoftwareIsa() in w:\lib\conflux\ThirdPartyStuff\libcuda\Sources\Libcuda\Libcuda\CudaVersions.cs:line 55
http://code.google.com/p/libcuda/source/browse/Libcuda/CudaVersions.cs

1) Какое у тебя значение, что на нем срабатывает кейс default свитча в файле CudaVersions.cs?
2) Ты ставил специальные CUDA-дрова? Если нет - скачай дрова 3.1 отсюда: http://developer.nvidia.com/object/cuda_archive.html.
3) Если да, то у тебя, вероятно, или старые дрова (Conflux поддерживает только 3.1) или слишком новые (т.е. 3.2 RC). Если первое, то поставь себе 3.1. Если второе, то я вечером вернусь домой и добавлю в этот свитч CudaVersion.CUDA_32RC. Ну или ты это можешь сам допилить руками =)
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 26th, 2010 03:05 pm (UTC)
(Link)
3.2 RC, ставить 3.1 не буду, потому что тогда поломается другая софтина :)

А куда оно сорцы libcuda сохраняет?
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 26th, 2010 09:43 pm (UTC)
(Link)
Сорцы либкуды оно тут же удаляет - специально по процессу, чтобы все баги фиксать вначале в либкуде, потом тестировать, коммитить и только потом накатывать. Это я затупил, предлагая тебе самому подпилить либкуду.

Впрочем, я только что пофиксал тему с форвард компатибилити и обновил гайд. Теперь все будет работать с 3.2 RC. Тебе надо просто обновить исходники Конфлакса и пересобрать либкуду с помощью батника.
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 26th, 2010 10:02 pm (UTC)
(Link)
Собралось, запустилось. Прикольно. Да, 19.77 секунд на тесты.
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 09:01 am (UTC)
(Link)
Супер =)

По поводу времени работы: 1) в честь чего-то раннер запускает тест два раза, т.е. результат надо делить на два, 2) очень много кодярника написано без оптимизаций, ибо нужно было получить proof of concept. пример: libptx активно юзает рефлексию и атрибуты для генерации и валидации ассемблера - если переписать это с использованием reflection.emit, то скорость конкрертного участка кода увеличится на пару порядков. По концовке я надеюсь заставить Truesight (декомпилятор) работать со скоростью рефлектора (сейчас он раза в 2-3 медленнее), трансформатор и кодогенератор за почти незаметное время (это получится, если прикрутить ленивость к преобразованиям AST), то же для интеропа с кудой.

Т.е. затраты по обработке кернела будут таковыми: 1) jit конфлакса (где-то пару секунд на моем компе, один раз за старт прилаги), 2) jit кернела (пару секунд на кернеле среднего размера, один раз для кернела, т.е. последующие запуски кэшируются), 3) копирование данных в видеопамять (тут перфоманс ограничен скоростью PCI Express, ибо p/invoke у дотнета вполне эффективен), 4) собственно вычисления на GPU (они очень быстрые - см. слайд с демонстрацией в слинкованной презентации - 0.003 секунды на умножение матриц размером несколько сотен на несколько сотен на моей не самой топовой карточке), 4) копирование результата в оперативную память (опять же, здесь упираемся в PCI Express).
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 26th, 2010 10:03 pm (UTC)
(Link)
Кстати, а можно ли поставить кудодрайвера на комп без нвидиевской железки и гонять в софтваре?

(Т.к. на девел-ноутбуке у меня ATI FireGL)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 08:02 am (UTC)
(Link)
В файлике демки есть закомментированная строчка. Если ее откомментировать, то получится софтваре - грид микро-потоков делится на блоки, которые выполняются разными тредами операционной системы. Для этого вообще не нужен куда-драйвер.
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 27th, 2010 08:16 am (UTC)
(Link)
Ага, и искать nvcuda.dll оно тоже не будет?
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 08:30 am (UTC)
(Link)
Неа, не будет.
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 27th, 2010 08:24 am (UTC)
(Link)

W:\lib\conflux\Conflux.Playground\bin\Debug>Conflux.Playground.exe 1>out.txt

Unhandled Exception: Conflux.Runtime.Cpu.Jit.KernelThreadException: A fatal error has occurred when running kernel thread
Kernel: Conflux.Playground.Demo.Tests\\\+MatMulKernel_CpuRuntimeJit
Logical thread: BlockIdx = Int32(0, 0, 0) of dim3(1, 1, 1), ThreadIdx = N/A of dim3(16, 16, 1)
Physical thread: Conflux CPU runtime worker thread #0
A short description of error: IndexOutOfRangeException: Index was outside the bounds of the array. ---> System.IndexOutOfRangeException: Index was outside the b
ounds of the array.
at Conflux.Playground.Demo.Tests\\\.MatMulKernel_CpuRuntimeJit.RunBlock(int3 blockIdx)
at Conflux.Runtime.Cpu.CpuRuntime.<>c__DisplayClassc.<>c__DisplayClasse.b__3(Int32 j) in W:\lib\conflux\Conflux\Runtime\Cpu\CpuRuntime.cs:line
52
--- End of inner exception stack trace ---
at Conflux.Runtime.Cpu.CpuRuntime.<>c__DisplayClassc.<>c__DisplayClasse.b__3(Int32 j) in W:\lib\conflux\Conflux\Runtime\Cpu\CpuRuntime.cs:line
57
at XenoGears.Functional.EnumerableExtensions.ForEach[T](IEnumerable`1 seq, Action`1 action) in W:\lib\xenogears\XenoGears\Functional\EnumerableExtensions.For
Each.cs:line 38
at Conflux.Runtime.Cpu.CpuRuntime.<>c__DisplayClassc.<>c__DisplayClasse.b__2() in W:\lib\conflux\Conflux\Runtime\Cpu\CpuRuntime.cs:line 43
at System.Threading.ExecutionContext.runTryCode(Object userData)
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()








(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 08:31 am (UTC)
(Link)
Хехе, я там специально баг оставил, чтобы на демке показать народу как работает отладка сгенерированного кода. Щяс пофикшу и вкоммичу =)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 08:53 am (UTC)
(Link)
Пофиксал. Тебе надо обновить Конфлакс и все заработает.
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 27th, 2010 09:22 am (UTC)
(Link)
О, работает. 2.2 сек ;)
(Reply) (Parent) (Thread)
[User Picture]
From:wizzard0
Date:September 27th, 2010 09:23 am (UTC)
(Link)
У меня очень-очень сильно чешутся руки скрестить это с http://jsc-solutions.net/ :)

Но надо время, а также проект, в котором можно сабж поюзать.
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:September 27th, 2010 12:05 pm (UTC)
(Link)
С последним особенная проблема, да.
(Reply) (Parent) (Thread)
(Deleted comment)
[User Picture]
From:xeno_by
Date:October 23rd, 2010 07:17 pm (UTC)

Re: Очень даже круто

(Link)
Спасибо! Проект опен-сорсный и для ресерча его можно юзать как угодно (для коммерческого юзания условия другие, но сейчас Конфлакс еще к этому не готов, поэтому опустим этот момент). На тему поучаствовать можно написать мне на мыло xeno.by@gmail.com или пообщаться в скайпе xeno.by.
(Reply) (Parent) (Thread)
From:(Anonymous)
Date:October 23rd, 2010 07:20 pm (UTC)

КРУТО

(Link)
Видел 2 похожих проекта: один написан индусом и забыт, один написан русским парнем для шейдеров в XNA и похоже тоже забыт. Я писал свою библиотеку для запуска кернелов написаных на асме на видахах АТИ, но ВЫ СВЕРНУЛИ ГОРЫ. Будет ли проект отркытым, как можно поучаствовать ? Можно оказатся впереди планеты всей В CUDA 3.0 например для видеокарт ферми не поддерживается динамичесое выделение памяти которое реализовано в асме - это могло бы стать killer feature этого проекта
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:October 23rd, 2010 07:21 pm (UTC)

Re: КРУТО

(Link)
http://xeno-by.livejournal.com/35664.html?thread=69712#t69712
(Reply) (Parent) (Thread)
[User Picture]
From:nponeccop
Date:December 6th, 2014 02:33 am (UTC)

Конфлакс

(Link)
А продолжение у этой истории есть?
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:December 6th, 2014 11:52 am (UTC)

Re: Конфлакс

(Link)
Единственное продолжение у истории заключается в том, что благодаря Конфлаксу я познакомился с ребятами из лаборатории LAMP EPFL и уехал туда делать PhD (примерно три с половиной года назад). С тех пор я забросил дотнет, поэтому проект не развивал.
(Reply) (Parent) (Thread)