Это хорошая идея для запуска динамически сгенерированного кода на моем GPU с использованием OpenCL, или есть более эффективные способы? - PullRequest
1 голос
/ 06 января 2020

Введение

Итак, позвольте мне представить проблему. В настоящее время я пишу программу на C#, в которой много вычислений (точнее, это библиотека нейронной сети), и я использовал стандартные массивы для хранения матриц, но я подумал, что лучше создать 2d, 3d матричный класс для инкапсуляции всех необходимых мне операций с матрицами, а затем для очистки циклов в моем коде.

Как вы, возможно, знаете, это довольно просто сделать sh с базовыми c операторами, перегружающими , но я столкнулся с другой проблемой, это было бы медленнее, чем обычно для циклов над массивами Так как в случае большого уравнения промежуточные классы, создаваемые перегрузкой операторов, могут вызвать дополнительные затраты. Я гуглил его и нашел статью , которая оказалась очень полезной для меня. Короче говоря, писатель использует дополнительные классы, чтобы сначала создать дерево уравнений, а затем скомпилировать его в методе C# с использованием MSIL (Microsoft Intermediate Language), который решает уравнение сразу.

Но потом я подумал о возможности выполнения матричных вычислений на моем GPU, так как это будет еще быстрее. Я наткнулся на пакет NuGet Cloo, который использует OpenCL и оболочку для него (я хотел бы, чтобы он работал на любой видеокарте, не только NVidia с ее CUDA) для запуска кода C на вашем GPU, но он, как я только что сказал, использует код C, который должен быть записан в виде строки.

Вопрос

Наконец, мой вопрос. Является ли хорошей идеей динамически генерировать кодовую строку C из дерева уравнений, чтобы вычислить мои оптимизированные уравнения на графическом процессоре, или есть другие способы сделать это sh.

1 Ответ

0 голосов
/ 06 января 2020

Прежде всего, правильный ответ на ваш вопрос - реализуйте оба способа и напишите тест . Поскольку мы не знаем, какой графический процессор используется, какой процессор используется, какой размер матрицы и т. Д. c.

Теоретически, графический процессор должен быть быстрее, если вы можете использовать SIMD * 1006. * / SIMT подход без ответвлений (например, без if s). Так что если вы можете написать планарный код, который работает с внутренними массивами, то GPU (встроенное событие) будет работать быстрее. Тем не менее, главное слово здесь - теоретически .

Практически:

  • . Net (и на основе JVM) кода гораздо проще поддерживать .
  • Код OpenCL работает по-разному для графических процессоров NVidia / AMD / Intel (потому что иногда вы можете хранить большое количество данных в локальной памяти , иногда вы не можете; иногда вы можете положиться на быстрый GDDR6, иногда видеокарта (например, встроенная) просто разделяет оперативную память компьютера).
  • Некоторое профилирование памяти графического процессора требует замораживания видео (чтобы уменьшить колебания). И у вас будет много других интересных вещей во время разработки GPU.

Однако, чтобы помочь вам:

  • Попробуйте сначала Умножение матрицы Tensorflow . Он имеет. Net привязок и может выполнять математические операции как на CPU, так и на GPU.
  • Сравнить. Net код с нативным, например - Rust / Kotlin Native / C ++. Вероятно, вы можете просто переместить все вычисления в собственную часть (все эти варианты намного проще, чем OpenCL-кодирование и поддержка).
  • С моей точки зрения (здесь нет доказательств, извините), гораздо проще написать код на нескольких языки, которые генерируют код на языке X из языка Y.
...