|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
OpenCL в Delphi XE2 под Win64bit: можете протестировать на своей видеокарте?
Суть проблемы. Есть весьма объёмный ПК для научных расчётов: интерфейс, База данных, много-поточные расчёты (на CPU пока), графика 2D, графика 3D на OpenGL, анимация результатов в виде компрессированного avi-файла на выходе - всё делалось на Delphi XE2...XE6 и прекрасно работает. Надо подключить модуль для переноса части длительных фрагментов расчёта на GPU. Этот модуль пытались писать на Visual Studio 2015 - расширение языка C++ AMP, как DLL: работает, но криво: не на всех видеокартах, увы (текст тестовой программы выложен в той же папке для скачивания - см.ниже). Ну и вечная проблема с недостающими DLL к тому что написано на Visual Studio: даже опции компилятора /MT не помогают... На JAVA тоже сейчас мои коллеги пишут этот расчётный модуль - через OpenCL... Ну не в этом вопрос. Есть примеры использования библиотеки OpenCL.dll прямо в проектах Delphi (чехи, например, делали, есть ещё компоненты от MITOV для Delphi Seattle - http://www.mitov.com/ ). Эти несложные примеры работают, но...только при компиляции под Win32, а компилируешь проект Delphi под Win64 - затык...
----- Сейчас вроде с помощью советов с другого форума, удалось траблы победить, и сделать работоспособный тест. ----- Вот ссылка для скачивания: http://gofile.me/2Zesj/C0f3wb1o ======== Там в папке: ======== 1) Полезная утилита GPU_Caps_Viewer_Setup_v1.26.0.0.exe для контроля состояния видеокарты, особенно, если нажать кнопку "More GPU Info". 2) OpenCL1_2_Delphi.zip - файл с примером от чехов (Университет Брно, насколько помню) использования OpenCL в Delphi, 2013год. У меня этот пример не всегда корректно работал при компиляции под Win64 (не на всех видео-картах). Но там хороший заголовочный файл CL.pas - его можно чуть доработать с учётом замечания про NativeInt с другого форума: заменить тип size_t на NativeInt для Win64, и использовать вместо моего "укороченного" MyOpenCL.pas - см.ниже. --- 3) Вложенная папка с моим вариантом программы-теста. Она самодостаточна: больше ничего не надо, ну разве что последние версии видео-драйверов установить. Тест сделан под Delphi XE2 (работает и под XE6). Причём работает, по крайней мере у меня, при компиляции под Win32, и что более важно- под Win64. Всего 2 файла: --> MyOpenCL.pas: заголовочный; я его урезал - убрал ненужные мне функции, которые в принципе можно взять из файла чехов CL.pas + учёл полезное замечание с др.форума про NativeInt ; --> FMain.pas : тестовая программа. Выделяет на GPU память (создаёт буферы) под 16 массивов (квадратных матриц из cl_Float - по 4 байта, размер стороны которых задаётся на основной форме, по умолчанию 1200) и под ещё один массив, того же размера, куда пишется результат несложных вычислений на GPU. Потом запускается итерационный цикл (количество итераций - для проверки времени работы - задаётся тоже на форме, по умолчанию - 12). Внутри каждой итерации 16 массивов заполняются данными, затем запускается ещё и внутренний цикл: 30 проходов вызова расчётного ядра на GPU. Такая структура тестовой программы больше всего подходит под наши научные задачи (вычислит. гидродинамика), но пока это лишь тест. В тесте есть несложная проверка правильности вычислений - для одного из элементов матрицы-результата, поскольку НЕ все драйверы видеокарт (особенно старые) могут диагностировать Kernel Error. --> программа на С для ядра - текстовый файл ProgramGPU.CL (должен лежать рядом с MyFirstOpenCL.exe !!): там можно глянуть, что делается с одномерными массивами на GPU. Она прямо передаётся в виде строки на GPU, там копилируется и линкуется - ну как обычно в OpenCL. Нужная DLL для OpenCL - под Win64 или Win32 - подключится из системных папок Windows автоматически, в зависимости от компиляции. ---- 4) Можете на своём сетапе запустить прямо готовый MyFirstOpenCL.exe (это версия 64bit !!) с параметрами: --> размер стороны матрицы = 3200; лезут 17 таких матриц на видеокарту от 1Gb и выше; если не влезут (часть видео-памяти уже занята чем-то - GPU_Caps_Viewer в помощь) - возможны ошибки, которые диагностируются НЕ всем драйверами видеокарт, а только новыми; --> количество итераций (внешний цикл) = 12. --- 5) У меня для указанного примера время счёта вышло: NVIDIA GT-430 (1Gb, 96core, 700MHz core) - 3мин 37сек; NVIDIA GTS-450 (1Gb, 192core, 810MHz core) - 1мин 36сек; NVIDIA GTX-570 (1.28Gb, 480core, 732MHz core) - 42.5сек; AMD Radeon R9 M275X (2Gb, 640core, 925MHz core) - 1мин 27сек - настольный моноблок ASUS 2702; NVIDIA GT-545 (3Gb, 144core, 720MHz core) - 2 мин 50сек (тестировали на др. форуме); NVIDIA GTX-980 (4Gb, 2048 CUDA Cores, 1278MHz) - 25.8сек (тестировали на др. форуме). === Тестировал здесь (добавляю): NVIDIA GeForce GTX 780 Ti (3Gb, 2880 CUDA Cores, 876MHz) - 23,6сек NVIDIA GeForce GTX 750 Ti (2Gb, 640 CUDA Cores, 1020MHz) - 43.7сек NVIDIA GeForce GTX 980 Ti (6Gb, 2816 CUDA Cores, 1190MHz Boost, MSI) - 22.1сек - добавил, после того как установил такой акселератор в свой комп (09.02.16). ---- Может кто-то попробовать MyFirstOpenCL.exe на своих видеокартах??? Поскольку это проект дельфовый, никакие внешние DLL ему не нужны (кроме тех что в Windows у всех есть), как и всякие - джава-машины: только для видео-карты новые драйверы желательны. Запустить, нажать верхнюю кнопку на форме, установить размер матрицы 3200 (если 1200 отработает корректно), выбрать платформу-девайс, нажать нижнюю кнопку на форме. Записать время счёта: оно выдаётся в итоговом окне. Нам сейчас на работу надо будет покупать новую карту 4-6Gb именно для расчётов...денег более 60тр вряд ли выделят... AMD конечно подешевле, но... Такие сопоставительные тесты на задачах, приближенных к нашим, были бы полезны!! Были бы полезны и замечания участников форума по тестовой программе. === К сожалению, у меня нет под рукой видео-карты (акселератора) с памятью на борту 4Gb-12Gb. Было бы интересно протестить и на таких "монстрах", повышая понемногу размер входной матрицы (требуемую память тестовая программа сообщит в начале работы): для того и писалось под Win64 - нужна большая память. Буду признателен! Последний раз редактировалось Prok186, 09.02.2016 в 15:11. |
#2
|
|||
|
|||
Ваш exe-шник прошёл за 10,19 сек (NVIDIA GT-740).
Window 7, 64-bit. |
#3
|
|||
|
|||
Это было для размера по умолчанию (1200). Для размера 3200 получилась 1 мин. 12 сек.
|
#4
|
||||
|
||||
Че-то ничего не считает у меня. После нажатия TestOpenCL получаю сообщение о размере памяти графического процессора и все. Возможно неподходящая ось. Тестил на Win10.
ПС: О я невнимателен оказался. Файлик CL не скачал. NVidia GeForce GTX 780 Ti Первый тест: 1200 - 2с 646мс Второй тест: 3200 - 23с 629мс Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 22.01.2016 в 18:53. |
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Prok186 (22.01.2016)
|
#5
|
|||
|
|||
Цитата:
https://www.ulmart.ru/goods/3594251#tab-properties |
#6
|
||||
|
||||
Именно эту модель не советую брать. Это модификация, причем довольно неудачная - два вентилятора достаточно шумные к тому же они довольно быстро выходят из строя. Вот такой вариант предпочтительнее.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
А пока тут вяло шло тестирование видеокарт... уже переписал часть "трудоёмкого" кода в своей основной (не тестовой уже) программе на OpenCL, 3 кернела. Сравнительно быстро всё отладил. Предварительный итог: время счёта на задачах (сутками считаются - гидродинамика) уже сократилось почти в 4 раза.
Поменял у себя на работе видео-карту на GeForce GTX-980ti - зверь! Кстати, фирме Khronos стало видимо стыдно, и она 05 февраля 2016г (!!!) выложила файлы поддержки OpenCL и CUDA (заодно, чтобы не мелочиться) для Delphi. Тут можно скачать: http://sourceforge.net/p/glscene/cod.../ParallelAPIs/ , для OpenCL хватит CL.pas, CL_Platform.pas, CL.inc. Но мне проще использовать для OpenCL.dll свой заголовочник, кот. уже выкладывал в посте 1. Итак. Чтобы не быть голословным, выкладываю во вложенной папке (см. ссылку для скачивания в 1-м посте), или прямо ссылку на вложенную папку - http://gofile.me/2Zesj/TOT6JHm0 Там, во-первых, новый работающий пример: выкинул всё написанное чехами, всё переписал заново, более осмысленно. Две программы-Kernel (так для пробы, используется в тесте первая), контроль погрешности - сравнение расчётов CPU vs GPU, использование в Kernel функции-atomic. Но Header-файл пока оставил свой, а не брал заголовочник, выложенный Khronos. Ещё там же в отдельной под-папке - 2 картинки-скана TIF с моими вопросами по работе новой видяхи GTX-980ti. Гляньте, плиз: почему такую частоту памяти видяхи показывает Caps-Viewer? И наконец, в папке OpenCL_Demo2016 есть под-папка с моими 3-мя Kernel для не тествых, а рельных расчётов- последний длинный вчера дописал и опробовал - можете полюбопытствовать! Вряд ли они кому-то понадобятся в таком виде, но вот как примеры для OpenCL (для любого языка программы на хосте - хоть Delphi, хоть JAVA)...могут быть полезны участникам форума. ==== ПыСы. Посоветуйте, коллеги, на каком форуме активно обсуждается написание самих Kernel для OpenCL (программки на языке, похожем на C99, которые компилирует сам драйвер видео-карты). Или здесь подскажите, как разбивать для Kernel'a большую программу на модули (хотя это в принципе есть в моём новом примере - уже вроде осилил), и главное - как обмениваться между этими модулями (процедурами) данными: только через их списки параметров? Через всю цепочку процедур этот список тащить до той, где они действительно нужны??? Писать весь расчётный модуль одним "монолитом" без разбивки на модули - не кашерно, сами понимаете. А мне сейчас надо запихнуть на GPU код в несколько тысяч строк... Последний раз редактировалось Prok186, 10.02.2016 в 20:38. |