{"id":13819142,"url":"https://github.com/dafadey/GPGPU_OpenCL_vs_CUDA","last_synced_at":"2025-05-16T04:32:36.903Z","repository":{"id":177268529,"uuid":"166140447","full_name":"dafadey/GPGPU_OpenCL_vs_CUDA","owner":"dafadey","description":"This is a repository with sample codes for testing memory bandwidth, arithmetic latency hiding and shared/local memory performance on AMD and nVidia devices","archived":false,"fork":false,"pushed_at":"2019-01-17T01:46:19.000Z","size":42,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-08-04T08:01:41.901Z","etag":null,"topics":["cuda","gpgpu","gpgpu-computing","opencl"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dafadey.png","metadata":{"files":{"readme":"README.txt","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-01-17T01:42:57.000Z","updated_at":"2020-12-14T12:17:00.000Z","dependencies_parsed_at":"2023-07-20T02:45:26.109Z","dependency_job_id":null,"html_url":"https://github.com/dafadey/GPGPU_OpenCL_vs_CUDA","commit_stats":null,"previous_names":["dafadey/gpgpu_opencl_vs_cuda"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dafadey%2FGPGPU_OpenCL_vs_CUDA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dafadey%2FGPGPU_OpenCL_vs_CUDA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dafadey%2FGPGPU_OpenCL_vs_CUDA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dafadey%2FGPGPU_OpenCL_vs_CUDA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dafadey","download_url":"https://codeload.github.com/dafadey/GPGPU_OpenCL_vs_CUDA/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225405538,"owners_count":17469365,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cuda","gpgpu","gpgpu-computing","opencl"],"created_at":"2024-08-04T08:00:41.046Z","updated_at":"2024-11-19T18:31:16.096Z","avatar_url":"https://github.com/dafadey.png","language":"C++","funding_links":[],"categories":["C++"],"sub_categories":[],"readme":"=========Где брать документацию=========\r\nпо nVidia не пишу. Они большие популяризаторы developer.nvidia.com, у них кстати классный форум там.\r\ngoogle - Best Practices Guide GPU и вы в первую очередь на CUDA и nVidia.\r\n\r\nС OpenCL как и со всем опен всё не так прямолинейно.\r\nВопервых OpenCL это кусочек стандартов Khronos group\r\nтоесть все что касается языка OpenCL надо искать тут https://www.khronos.org/opencl/\r\nнапример\r\nтипы данных:\r\nhttps://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/scalarDataTypes.html\r\nфункции потока\r\nhttps://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/workItemFunctions.html\r\nЭто языковая часть. Не стоит там искать методов оптимизации.\r\n\r\nЧто касается устройств AMD тоесть для файн тюнинга (без которого с GPU впрочем и смысла нет):\r\nhttps://developer.amd.com/amd-accelerated-parallel-processing-app-sdk/\r\nhttp://developer.amd.com/wordpress/media/2013/12/AMD_OpenCL_Programming_Optimization_Guide2.pdf\r\n(имеет смысл скачать pdf так как html версия глюкаво показывает картинки, схемы и даже таблицы)\r\n\r\nОдна мелкая полезная ссылка по кодам ошибок (кажется я провёл тут больше всего времени)\r\nhttps://streamhpc.com/blog/2013-04-28/opencl-error-codes/\r\n\r\n\r\n=========Пакет кодов к тренингу===========\r\nЯ добавил кучу коментов с псевдографикой(псевдосхемами). Основной упор получился на OpenCL,\r\nпоэтому аннотирован именно этот код. Из отличий от AMD у nVidia нет проблем с канальностью памяти, +nVidia сильно тормозит на делении с плавающей точкой в остальном тендеции похожи.\r\nОбычно в nVidia надо брать гораздо большее количество активных блоков чем в AMD.\r\n*Если ктото готов запустить эти OpenCL тесты на платформе nVidia прошу сообщить о результатах, особенно если это будут топовые 600 и 700 серии ускорителей. тогда мы сможем сравить производительность с примерно эквивалентным 7970-м Radeon-ом.\r\n\r\nВсе тесты написаны под Linux. Система сборки примитивная - bash скриптом, что впрочем полезно для понимания как собирать с нуля.\r\nЧтобы собрать тест имеет смысл открыть run или build скрипт, посмотреть что он делает, возможно поправить пути, и в бой.\r\n*для nVidia перед сборкой нужно проверить, что ваша карта поддерживает Compute Capability (у меня там кажется 3.0 стоит по дефолту).\r\n\r\nПрошу прощения за отсутсвие схем устройства GPU и последовательности запуска задач, но они уже 100 раз нарисованы в любом руководстве (советую nVidia, так как у них, как уже отмечалось, рука набита на популяризации GPGPU).\r\nВ сухом остатке для разработки вы должны помнить 3 вещи:\r\n1. coalesced чтение/запись памяти\r\n2. если 1 никак не выполнить вам точно нужна shared память. у неё тоже есть банки, помним об этом и разрабатываем правильный паттерн доступа.\r\n3. конвеер = occupancy(это слово на каждой странице nVidia Best Practices, но понять зачем оно вам надо, можно только поняв, почему без конвеера все будет работать весьма угрюмо) = разделение ресурсов.\r\nэто 3 связанных понятия. вы должны закидать на устройство больше задач, чем у него имеется физических исполнительных юнитов, чтобы загрузить конвеер, при этом вы должны следить, что все ваши задачи МОГУТ одновременно исполняться и ЗАГРУЗЯТ таки конвеер. для этого им должно хватить ресурсов (помните в этом неприятном смысле всё общее и локальная память и регистры).\r\n\r\n*На тренинге случилась заминка с таймингами. Все ядра вдруг стали работать значительно хуже.\r\n Это моя проблема я забыл что в предыдущем запуске я показывал неоптимальную конфигурацию запуска (малое число блоков)\r\n Вобщем прежде чем продолжать с блочным чтением и каналами надо было вернуть обратно общее количество блоков.\r\n\r\n**Если появится группа желающая снова обсудить разработку для GPU мы можем неформально собраться в томже зуме, а можно и живьем в Ауриге (только нам надо будет доступ к тачке с интересующими вас девайсами).\r\n\r\n\r\n===========ссылки на развлекательные ресурсы==========\r\n*тут вы врятли почерпнёте практические знания, но тем не менее...\r\nприключения электромагниного волнового пакета и идеальной электронной плазмы с GPU:\r\nhttps://www.youtube.com/watch?v=qbYcXZ_zoWQ\r\nhttps://www.youtube.com/watch?v=TD4XnEgjhFk\r\n\r\nрезиновый кубик из пружинок\r\n(ужасно тормозная вещь ибо связи кубиков дурацкие и доступ к памяти получился плохой)\r\nhttps://www.youtube.com/watch?v=1B6FeWbg1wY\r\nhttps://www.youtube.com/watch?v=dof7bbHQAV0\r\n\r\nкак пробивался воздух с помощью небольшого численного кода и GPU (на самом деле жуткий код который шарить смысла нет):\r\nhttps://www.youtube.com/watch?v=epEUqBdbUhs\r\nвидео сделано по мотивам работы описанной в статье.\r\nв ней рассказано не только как интегрировать\r\nно и как делать прогонку для обращения трёхдиагональной матрицы! а может там и нет про интегрирование\r\nв любом случае прогонка даже интереснее. собственно вот ссылка:\r\nhttps://www.sciencedirect.com/science/article/pii/S1877750312000920\r\n\r\nи кстати по плану Ауриговского саморазвития я должен был ещё про NUMA рассказать.\r\nэто достаточно тривиальная, но весьма актуальная вещь для всех современных рабочих станций x86\r\nвот статья http://www.computeroptics.ru/jour/article/view/402\r\nв контекст GPU девелопмента NUMA органично вливается потому, что многопроцессорные рабочие станции уже нельзя рассматривать в модели N ядер + одна большая общая память и все равны.\r\n\r\nесли чтото не качается, пишите - пороюсь, найду, пришлю.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdafadey%2FGPGPU_OpenCL_vs_CUDA","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdafadey%2FGPGPU_OpenCL_vs_CUDA","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdafadey%2FGPGPU_OpenCL_vs_CUDA/lists"}