Nano Hash - криптовалюты, майнинг, программирование

Параллелизм GPU с возможностью регулярно очищать буфер?

Я нашел способ разбить долго работающий алгоритм на параллельные куски. Я не совсем понимаю, поможет ли мой подход к реализации этого в OpenCL.

Одним из препятствий для меня является то, что для «результатов», которые я рассчитываю, я не знаю, сколько ожидать при выполнении каждой задачи.

Итак, мой план состоит в том, чтобы создать буфер с достаточным пространством, например, для 10 результатов, и еще один буфер, который просто хранит значение, указывающее, заполнен ли буфер.

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

Например, это некоторый псевдокод попытки подхода:

* Create a vector to store all results
* Create the "results" buffer.
* Create the "is-filled" buffer to store whether results buffer was filled.

while (some condition) {
    // Before task.
    * Create the "input" buffer with data (input data comes from an expensive function).
    * Update kernel arguments.

    // Run task.
    queue.enqueueTask(kernel);

    // After task.
    * Read the "is-filled" buffer to determine whether "results" buffer is full.
    if ("results" buffer is full) {
       * Read the "results" buffer into the vector.
       * Read the "input" buffer (now changed to indicate next inputs to 'resume' task)
       * Reset "results" & "is-filled" buffers
    }

}

Read remaining "results" buffer into the vector.

Это кажется неудобным, если бы был другой способ справиться с заполнением буферов, я бы хотел знать.

Однако наиболее тревожным моментом является то, что раздел «После задачи» блокирует выполнение и предотвращает возникновение параллелизма.

Итак, мои проблемы, которые являются препятствием для параллелизма: переменное количество результатов и изменение аргументов перед каждой задачей. Моя попытка рабочего процесса может быть еще более проблематичной :)

Как бы вы подошли к этому?

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

03.08.2017

  • Тогда используйте двойную буферизацию. Это позволит всему случиться одновременно. 03.08.2017
  • Спасибо, у меня работает множественная буферизация. Что я делаю, так это пишу буфер в начале каждого цикла, выполняю неблокирующее чтение в вектор векторов в конце цикла и вызываю queue.finish() после цикла и перед потреблением данных ( который теперь немного разделен, но я могу с этим справиться). Это означает, что я отправляю больше памяти на устройство и с устройства. Мне, вероятно, понадобится второй цикл или обернуть все это в другой цикл, чтобы вернуться и возобновить любые задачи, в которых буфер был заполнен, хотя сейчас это вряд ли произойдет; Я, вероятно, все еще должен заняться этим делом. 03.08.2017
  • Может быть, вы можете использовать события вместо if (буфер результатов заполнен)? Чтобы эта часть могла управлять остальными, а не проверять на каждом шагу, можно ли работать с этой частью независимо. До сих пор вы получали больше производительности с двойной буферизацией? 03.08.2017
  • Спасибо, теперь я изучаю, как я могу использовать события. Да, похоже, я выполняю одновременно с новым подходом к буферизации. 03.08.2017
  • Не могли бы вы подробнее рассказать об идее использования событий для сообщения хосту о том, что буфер заполнен? 10.08.2017
  • Событие предназначено для мелкозернистого управления. С ним вещи могут реагировать быстрее, чем явно ждать чего-то. Использование обратного вызова с событием приводит к запуску хост-функций завершением команд на стороне устройства. В вашей ситуации каждая операция будет увеличивать счетчик с помощью обратного вызова события, и после 9-10 этот обратный вызов вызывает необходимую функцию очистки буфера. Таким образом, вы можете отправлять 10-20 из них за раз, и только после 10-го буфер очищается, а также вы можете использовать пользовательские события, чтобы следующий пакет команд ожидал завершения действия очистки буфера. 10.08.2017

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..