Проблема
Здравствуйте, я использую ускоряющую библиотеку для создания приложения, позволяющего пользователю интерактивно вызывать функции, обрабатывающие изображения, поэтому я основываюсь и расширяю ghci с помощью ghc api.
Проблема заключается в том, что при запуске скомпилированного исполняемого файла из оболочки вычисления выполняются под 100 мс (чуть меньше 80), при запуске одного и того же скомпилированного кода в ghci он принимает более 100 мс (в среднем чуть более 140), чтобы отделка.
Ресурсы
пример кода + журналы выполнения: https://gist.github.com/zgredzik/15a437c87d3d8d03b8fc
Описание
Прежде всего: тесты выполнялись после того, как было скомпилировано ядро CUDA (сама компиляция добавила дополнительные 2 секунды, но это не так).
При запуске скомпилированного исполняемого файла из оболочки вычисления выполняются менее чем за 10 мс. (shell first run
и second shell run
имеют разные аргументы, чтобы убедиться, что данные не кэшированы нигде).
При попытке запустить тот же код из ghci и возиться с входными данными, вычисления занимают более 100 мс. Я понимаю, что интерпретируемый код медленнее, чем скомпилированный, но я загружаю один и тот же скомпилированный код в сеанс ghci и вызывая тот же самый привязку верхнего уровня (packedFunction
). Я явно напечатал его, чтобы убедиться, что он специализирован (такие же результаты, как и с помощью SPECIALIZED pragma).
Однако вычисления занимают менее 10 мс, если я запускаю функцию main
в ghci (даже при изменении входных данных с помощью :set args
между последовательными вызовами).
Скомпилирован Main.hs
с помощью ghc -o main Main.hs -O2 -dynamic -threaded
Мне интересно, откуда возникают накладные расходы. Кто-нибудь имеет какие-либо предложения относительно того, почему это происходит?
Упрощенная версия примера, представленная remdezx:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Array.Accelerate as A
import Data.Array.Accelerate.CUDA as C
import Data.Time.Clock (diffUTCTime, getCurrentTime)
main :: IO ()
main = do
start <- getCurrentTime
print $ C.run $ A.maximum $ A.map (+1) $ A.use (fromList (Z:.1000000) [1..1000000] :: Vector Double)
end <- getCurrentTime
print $ diffUTCTime end start
Когда я его компилирую и выполняю, он завершает выполнение 0,09s.
$ ghc -O2 Main.hs -o main -threaded
[1 of 1] Compiling Main ( Main.hs, Main.o )
Linking main ...
$ ./main
Array (Z) [1000001.0]
0.092906s
Но когда я прекомпилирую его и запускаю в интерпретаторе, он принимает 0,25 с
$ ghc -O2 Main.hs -c -dynamic
$ ghci Main
ghci> main
Array (Z) [1000001.0]
0.258224s