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

Насколько быстрее Eigen для небольших матриц фиксированного размера?

В настоящий момент я использую Julia, но у меня есть критически важная функция производительности, которая требует огромного количества повторяющихся матричных операций с небольшими матрицами фиксированного размера (3-х или 4-х мерными). Кажется, что все матричные операции в Julia обрабатываются серверной частью BLAS и LAPACK. Также кажется, что внутри некоторых из этих функций происходит выделение большого количества памяти.

Существует библиотека julia для небольших матриц, которая может похвастаться впечатляющим ускорением для матриц 3x3, но не обновлялась в 3 года. Я подумываю переписать свою критическую для производительности функцию в Eigen

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

21.02.2016

  • Проведите несколько тестов и убедитесь в этом сами. Это единственный способ ответить на вопрос с уверенностью. Убедитесь, что вы скомпилировали Eigen с оптимизацией. И попробуйте как с включенным OpenMP, так и без него. 22.02.2016
  • Хороший момент, чтобы вспомнить цитату: Первое правило оптимизации: не делайте этого! Или мудрые слова Кнута: Преждевременная оптимизация - корень всех зол ... И положительный момент: если есть конкретное узкое место в производительности, то делитесь немного кода в вопросе может помочь. 22.02.2016
  • Вы пробовали Base.LinAlg.matmul3x3! и другие функции в этом модуле? Они обходят BLAS и позволяют выполнять минимальные вычисления распределения. 22.02.2016
  • Очень интересно, не пробовал, посмотрю. Есть ли какие-то другие функции специально для матриц 3x3? 22.02.2016
  • Думаю, ваш ответ здесь: github.com/SimonDanisch/FixedSizeArrays.jl 22.02.2016
  • да да !! Я думаю, что это именно то, что я ищу, я много искал, но не смог найти этого. Вы знаете, есть ли намерение включить массивы фиксированного размера в базовую версию julia? Есть ли другие подобные проекты? 23.02.2016
  • Подождите, эти массивы фиксированного размера неизменяемы, а это значит, что я не могу изменить отдельные элементы, верно? @mschauer 23.02.2016
  • @Lindo Да и нет, FixedSizeArrays.jl также предоставляет некоторую инфраструктуру для изменяемых массивов фиксированного размера, и абстракция обычных массивов неизменяемых массивов фиксированного размера также может помочь. 23.02.2016

Ответы:


1

Если вам нужны быстрые операции с небольшими матрицами, я настоятельно рекомендую StaticArrays. Например (ПРИМЕЧАНИЕ: изначально это было написано до пакета BenchmarkTools, который теперь рекомендуется):

using StaticArrays
using LinearAlgebra

function foo(A, b, n)
    s = 0.0
    for i = 1:n
        s += sum(A*b)
    end
    s
end

function foo2(A, b, n)
    c = A*b
    s = 0.0
    for i = 1:n
        mul!(c, A, b)
        s += sum(c)
    end
    s
end

A = rand(3,3)
b = rand(3)
Af = SMatrix{3,3}(A)
bf = SVector{3}(b)

foo(A, b, 1)
foo2(A, b, 1)
foo(Af, bf, 1)

@time foo(A, b, 10^6)
@time foo2(A, b, 10^6)
@time foo(Af, bf, 10^6)

Полученные результаты:

julia> include("/tmp/foo.jl")
  0.080535 seconds (1.00 M allocations: 106.812 MiB, 14.86% gc time)
  0.064963 seconds (3 allocations: 144 bytes)
  0.001719 seconds (2 allocations: 32 bytes)

foo2 пытается быть умным и избегать выделения памяти, но при использовании StaticArrays наивная реализация просто поражает.

23.02.2016
  • Спасибо за ответ, Тим, пока все хорошо, сейчас меня сдерживает только одна вещь. У меня есть десятки тысяч 3x3 и 3x1, но они меняются на каждой итерации моего алгоритма. В идеале, когда они были созданы, я бы хотел изменить их с помощью setindex! т.е. bf [1] = 44, но пакет еще не поддерживает это. Что я должен делать? 23.02.2016
  • В первую очередь создайте их как Fixed. Например, вместо возврата [a,b,c] из функции верните Vec((a,b,c)). Это будет намного быстрее. Часто setindex! не требуется, просто замените всю матрицу. (Иногда LLVM реализует это как замену под капотом, но вы не узнаете этого, не глядя.) 23.02.2016
  • В моем алгоритме есть огромное количество матриц и векторов фиксированного размера, которые меняются на каждой итерации. На данный момент у меня есть массив типа x = Array {FixedSizeArrays.Vec {2, Float64}, 1} (). Если я изменю его размер, эти ребята будут инициализированы, и назначение x [1] = Mat (..) больше не будет работать. Точно так же мне нужно было бы создавать этот массив x на каждой итерации моего цикла for, и, поскольку это большой массив, это было бы огромной нагрузкой на выделение памяти. Я хотел бы выделить этот массив x перед тем, как перейти к циклу for, а затем иметь возможность изменять x [i]. 25.02.2016
  • Я также переписал свой код, как вы предлагаете, выполнив sizehint! (X, n), а затем нажмите! (X, Mat (...)), потому что я не могу изменить инициализированные маты. Время выполнения моего кода в 7 раз больше при использовании FixedSizeArrays. При профилировании большая часть времени уходит в constructor.jl. Кажется, Vec ((a, b, c)) убивает его. 25.02.2016
  • обсуждение продолжается на github.com/SimonDanisch/FixedSizeArrays.jl/issues/75 25.02.2016
  • Если x - это Array, вы можете изменить x[i]. Вы просто не можете изменять x[i][j]. (Но вы можете заменить x[i], что я рекомендую.) 26.02.2016
  • Новые материалы

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

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

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

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

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

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

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