Как запустить вычисления за n секунд в Юлии? - PullRequest
1 голос
/ 11 июля 2020

Я хотел бы запустить тяжелые вычисления в Julia в течение фиксированного времени, например 10 секунд. Я пробовал это:

timer = Timer(10.0)
while isopen(timer)
    computation()
end

Но это не работает, так как вычисления никогда не позволяют планировщику задач Джулии взять под контроль. Поэтому я добавил yield() в l oop:

timer = Timer(10.0)
while isopen(timer)
    yield()
    computation()
end

Но теперь есть значительные накладные расходы от вызова yield(), особенно когда один вызов computation() короткий. Думаю, я мог бы вызывать yield() и isopen() только каждые 1000 итераций или около того, но я бы предпочел решение, в котором мне не приходилось бы настраивать количество итераций каждый раз, когда я меняю вычисления. Есть идеи?

1 Ответ

1 голос
/ 13 июля 2020

В приведенном ниже шаблоне используются потоки, и на моем ноутбуке задержка составляет около 35 мс на каждые 1000000 вызовов, что более чем приемлемо для любого задания.

Вы также можете использовать Distributed. Приведенный ниже код, кажется, имеет намного лучшую задержку - всего около 1 мс на каждые 1000000 проверок тайм-аута.

using Distributed
using SharedArrays
addprocs(1)
function get_termination_handle(timeout=5,workerid::Int=workers()[end])::SharedArray{Bool}
    handle = SharedArray{Bool}([false])
    proc = @spawnat workerid begin
        sleep(timeout)
        handle[1]=true
    end
    handle
end


function fun_within_timeout()
    res = 0
    h = get_termination_handle(0.1)
    for i = 1:100_000_000
        res += i % 2 == 0 ? 1 : 0
        h[1] && break
    end
    res
end

...