2015-02-02 2 views
1

В лаборатории у нас есть гетерогенная кластерная установка со многими процессорами Intel, несколькими процессорами AMD и несколькими графическими процессорами Nvidia.Готово ли OpenCL для использования на процессоре?

Для разработки HPC, единственная вещь, которую я знаю, что я могу написать один раз и запустить всюду на этой установке, - OpenCL (даже Java;)). Но здесь, в лаборатории, мы очень привыкли использовать C или Fortran plus MPI для разработки полностью для процессора, и, может быть, редко, кому-то, возможно, потребуется использовать узел Nvidia для запуска чего-то в CUDA.

Теперь, в начале нового проекта, я подумал, что было бы очень хорошо иметь возможность кодировать вещи в MPI + OpenCL и быть в состоянии включать в распределенную обработку как графические процессоры, так и процессоры, работая с тем же кодом OpenCL , Итак, целесообразно ли, что OpenCL-реализации готовы к такой задаче? С кодом OpenCL, работающим на процессоре с Intel SDK, могу ли я рассчитывать с такой же хорошей производительностью, как и с многопоточной программой на языке C, скомпилированной с помощью компилятора Intel? Можете ли вы указать на сравнения и контрольные показатели?

ответ

0

Мне повезло, перенося мой код OpenCL через процессор и графический процессор. Мой проект Levenberg-Marquardt заключался в том, что я сначала написал все на C, чтобы отладить его, а затем портировал его на OpenCL на процессоре Intel, чтобы проверить результаты и сделать немного больше отладки, а затем OpenCL на графическом процессоре AMD.

Лучший трюк, который я нашел для написания хорошего кода OpenCL на устройствах, - это объединить глобальную память в локальную память, даже если вы используете CPU, поскольку это обычно является узким местом на графическом процессоре. Вторым узким местом, которое я обнаружил на графическом процессоре и процессоре, был размер ядра, процессор может обрабатывать более крупные ядра, чем графический процессор, поэтому помните о типе памяти, который вы используете для констант, о том, какая локальная память выделена и т. Д.

было около 6 месяцев, поэтому, возможно, оно исправлено, но AMD FFT отлично поработала на процессоре Intel, графическом процессоре и графическом процессоре AMD, но не работала на графическом процессоре NVIDIA. На форумах AMD был поток, где это было связано с тем, что NVIDIA не поддерживает некоторые векторные функции.

2

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

Чтобы ответить на ваш конкретный вопрос, исходя из многочисленных сторонних оценок, нет, я бы не ожидал, что OpenCL превзойдет хорошо написанный C + OpenMP на процессорах Intel. Есть ряд причин для этого.

Обратите внимание, что ошибки в моем ответе чрезвычайно велики из-за широкой природы вопроса. Было бы полезно получить более подробную информацию о том, что вы собираетесь вычислить.

1

В дополнение к другим ответам и еще раз подчеркнуть один важный момент: вопрос очень широк, и производительность будет зависеть от многих факторов, которые вы не упомянули в вопросе. Возможно, вы уже знаете об этих факторах, но в сомнении, резюме можно найти в this answer (вопрос может показаться не связанным с первого взгляда и относится к CUDA, но многие концепции применимы и к OpenCL)

One из основных идей движения за OpenCL heterogeneous computing (замечательно, на странице даже не упоминается OpenCL ...). То есть OpenCL ставит своей целью предложить разработчику возможность использовать все доступные ресурсы обработки, от одного ядра ARM до нескольких high-end графических процессоров с тысячами ядер.

Эта универсальность стоит дорого. Некоторые концепции неявно адаптированы для архитектуры многоядерных архитектур (или, по крайней мере, до сих пор это основная область применения).И в любом случае, «оптимизация» программы OpenCL часто означает «настройку ее для быстрого запуска на один определенной архитектуры». Такие вещи, как векторизация или разделяемая память, могут быть выгодными на одной платформе или вообще недоступны на другом.

Есть некоторые возможности обойти это или, по крайней мере, попытаться сделать одну программу OpenCL более «агностикой» аппаратного обеспечения, на котором она будет работать. Один очевидный вариант - запросить свойства целевой платформы (например, предпочтительные размеры вектора или доступность разделяемой памяти) и запустить разные ядра в зависимости от результата. Благодаря встроенному компилятору в OpenCL, можно даже включить оптимизацию на платформе, например, через #define s, в исходный код ядра. Тем не менее, трудно сделать общие заявления о соотношении усилий и производительности для такого рода оптимизаций. И еще труднее предсказать, возможно ли снижение производительности «универсальной» реализации OpenCL (по сравнению с полностью измененной C-реализацией) не будет компенсироваться, когда количество ядер увеличится, а компиляторы OpenCL станут лучше.

Таким образом, моя рекомендация состояла бы в том, чтобы выполнить некоторые контрольные показатели «репрезентативных» задач и посмотреть, является ли производительность конкурентоспособной среди разных устройств, имея в виду, что среднее количество ядер каждого устройства (и, скорее всего, общая гетерогенность устройств), и OpenCL может упростить адаптацию к этим изменениям.

Смежные вопросы