Как сделать использование Threads необязательным в функции Julia - PullRequest
5 голосов
/ 27 октября 2019

У меня есть функция, которая дополнительно использует потоки для своего основного цикла, делая это, когда аргумент usingthreads равен true. На данный момент код выглядит следующим образом:

function dosomething(usingthreads::Bool)
    n = 1000
    if usingthreads
        Threads.@threads for i = 1:n
            #20 lines of code here
        end
    else
        for i = 1:n
            #same 20 lines of code repeated here
        end
    end
end

Менее неприятно, чем выше, было бы поместить «20 строк» ​​в отдельную функцию. Есть ли другой способ?

1 Ответ

4 голосов
/ 27 октября 2019

Вы можете использовать макрос, который меняет свое поведение в зависимости от результата Threads.nthreads():

macro maybe_threaded(ex)
    if Threads.nthreads() == 1
        return esc(ex)
    else
        return esc(:(Threads.@threads $ex))
    end
end

Без потоков этот макрос будет недоступен:

julia> @macroexpand @maybe_threaded for i in 1:5
           print(i)
       end
:(for i = 1:5
      #= REPL[2]:2 =#
      print(i)
  end)

Но когда многопоточность включена и, например, JULIA_NUM_THREADS=4 она расширится до версии с резьбой:

julia>  @maybe_threaded for i in 1:5
           print(i)
       end
41325

Редактировать: Перечитывая вопрос, я понимаю, что на самом деле это не отвечает, но это может быть полезно в любом случае.

...