Какие функции делают OpenCL уникальным выбором для расчетов над OpenGL с GLSL?Несмотря на связанную с графикой терминологию и непрактичные типы данных, есть ли реальное предостережение для OpenGL?
Да: это графический API.Поэтому все, что вы делаете в нем, должно быть сформулировано в соответствии с этими условиями.Вы должны упаковать свои данные как некоторую форму «рендеринга».Вы должны выяснить, как обращаться с вашими данными с точки зрения атрибутов, однородных буферов и текстур.
С OpenGL 4.3 и OpenGL ES 3.1 вычисляют шейдеры , все становится немного более запутанным,Вычислительный шейдер может получить доступ к памяти через SSBO / Image Load / Store аналогично вычислительным операциям OpenCL (хотя OpenCL предлагает реальные указатели, а GLSL - нет).Их взаимодействие с OpenGL также намного быстрее, чем взаимодействие OpenCL / GL.
Несмотря на это, вычислительные шейдеры не меняют одного факта: вычислительные операции OpenCL работают с очень различной точностью, чем вычислительные шейдеры OpenGL,Требования GLSL к точности с плавающей запятой не очень строги, а OpenGL ES еще менее строги.Поэтому, если точность вычислений с плавающей точкой важна для ваших вычислений, OpenGL не будет наиболее эффективным способом вычисления того, что вам нужно для вычисления.
Кроме того, для вычислительных шейдеров OpenGL требуется оборудование с поддержкой 4.x, тогда как OpenCL можетработать на более низком оборудовании.
Более того, если вы выполняете вычисления, используя кооптирование конвейера рендеринга, драйверы OpenGL по-прежнему будут предполагать, что вы делаете рендеринг.Таким образом, он будет принимать решения по оптимизации на основе этого предположения.Он оптимизирует назначение ресурсов шейдера, если вы рисуете изображение.
Например, если вы рендерите в кадровый буфер с плавающей запятой, драйвер может просто решить выдать вам кадровый буфер R11_G11_B10, потому чтоон обнаруживает, что вы ничего не делаете с альфа-версией, и ваш алгоритм может допустить более низкую точность.Однако если вы используете загрузку / хранение изображений вместо кадрового буфера, у вас гораздо меньше шансов получить этот эффект.
OpenCL не является графическим API;это вычислительный API.
Кроме того, OpenCL просто дает вам доступ к большему количеству материалов.Это дает вам доступ к уровням памяти, которые неявно относятся к GL.Некоторая память может быть разделена между потоками, но отдельные экземпляры шейдеров в GL не могут напрямую влиять друг на друга (за пределами Image Load / Store, но OpenCL работает на оборудовании, к которому нет доступа).
OpenGL скрывает, что аппаратное обеспечение делает за абстракцией.OpenCL предоставляет вам почти точно то, что происходит.
Вы можете использовать OpenGL для выполнения произвольных вычислений.Но вы не хотите , чтобы;нет, пока есть вполне жизнеспособная альтернатива.Вычисления в OpenGL живут для обслуживания графического конвейера.
only причина выбора OpenGL для любого вида вычислительных операций без рендеринга состоит в поддержке аппаратного обеспечения, которое не может запустить OpenCL.В настоящее время это включает в себя много мобильного оборудования.