JL Julia  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Многопоточность

Профессиональные сценарии по теме «Многопоточность» проверяют диагностику, производительность, безопасность и способность защитить архитектурное решение. Вопросы требуют читать код, находить границу применимости, выбирать проверяемую правку и отличать свойства Julia от поведения конкретного пакета. В тесте 30 вопросов: 18 заданий с кодом и 12 заданий с математической записью. Все формулировки рассчитаны на Julia 1.12.6; для сторонних библиотек используется явно названный API.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 30
Что именно следует из фрагмента с `@threads for i in eachindex(x)`?
S=\sum_{k=1}^{p}S_k
JuliaJulia · Потоки Threads
using Base.Threads
function threaded_sum(x)
    partial = zeros(Float64, nthreads())
    @threads for i in eachindex(x)
        partial[threadid()] += x[i]
    end
    return sum(partial)
end
@show nthreads() threaded_sum(rand(100_000))
Вопрос 2 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `@threads for i in eachindex(x)`?
JuliaJulia · Потоки Threads
using Base.Threads
function threaded_sum(x)
    partial = zeros(Float64, nthreads())
    @threads for i in eachindex(x)
        partial[threadid()] += x[i]
    end
    return sum(partial)
end
@show nthreads() threaded_sum(rand(100_000))
Вопрос 3 из 30
Что должно остаться истинным после рефакторинга участка с `@threads for i in eachindex(x)`?
JuliaJulia · Потоки Threads
using Base.Threads
function threaded_sum(x)
    partial = zeros(Float64, nthreads())
    @threads for i in eachindex(x)
        partial[threadid()] += x[i]
    end
    return sum(partial)
end
@show nthreads() threaded_sum(rand(100_000))
Вопрос 4 из 30
Как проверить, что новая реализация `@threads for i in eachindex(x)` не изменила обещанное пользователю поведение?
S=\sum_{k=1}^{p}S_k
Вопрос 5 из 30
Какой тезис о `@threads for i in eachindex(x)` можно честно закрепить в справке?
Вопрос 6 из 30
Что именно следует из фрагмента с `counter[] += 1`?
x_{t+1}=x_t+\Delta_1+\Delta_2
JuliaJulia · Гонки данных
using Base.Threads
counter = Ref(0)
@threads for _ in 1:100_000
    counter[] += 1
end
@show counter[]
Вопрос 7 из 30
Что нужно подтвердить отдельным примером для `counter[] += 1`?
JuliaJulia · Гонки данных
using Base.Threads
counter = Ref(0)
@threads for _ in 1:100_000
    counter[] += 1
end
@show counter[]
Вопрос 8 из 30
Что должно остаться истинным после рефакторинга участка с `counter[] += 1`?
JuliaJulia · Гонки данных
using Base.Threads
counter = Ref(0)
@threads for _ in 1:100_000
    counter[] += 1
end
@show counter[]
Вопрос 9 из 30
Какой результат приёмочного теста подтвердит корректность участка с `counter[] += 1`?
x_{t+1}=x_t+\Delta_1+\Delta_2
Вопрос 10 из 30
Какое ограничение стоит прямо указать в документации к участку с `counter[] += 1`?
Вопрос 11 из 30
Какой механизм Julia определяет поведение строки `atomic_add!(counter, 1)`?
\operatorname{atomic}(x\leftarrow x+1)
JuliaJulia · Атомарные операции
using Base.Threads
counter = Atomic{Int}(0)
@threads for _ in 1:100_000
    atomic_add!(counter, 1)
end
@show counter[]
Вопрос 12 из 30
Что нужно подтвердить отдельным примером для `atomic_add!(counter, 1)`?
JuliaJulia · Атомарные операции
using Base.Threads
counter = Atomic{Int}(0)
@threads for _ in 1:100_000
    atomic_add!(counter, 1)
end
@show counter[]
Вопрос 13 из 30
Какое решение устраняет риск вокруг `atomic_add!(counter, 1)`, не меняя поведение на допустимых данных?
JuliaJulia · Атомарные операции
using Base.Threads
counter = Atomic{Int}(0)
@threads for _ in 1:100_000
    atomic_add!(counter, 1)
end
@show counter[]
Вопрос 14 из 30
После обновления Julia или пакета поведение участка с `atomic_add!(counter, 1)` изменилось. Какой критерий приёмки остаётся корректным?
\operatorname{atomic}(x\leftarrow x+1)
Вопрос 15 из 30
Какое ограничение стоит прямо указать в документации к участку с `atomic_add!(counter, 1)`?
Вопрос 16 из 30
Какое объяснение для `@spawn sum(@view x[r])` выдержит проверку на другом допустимом входе?
T_p\approx T_1/p+T_{sched}
JuliaJulia · Разбиение работы
using Base.Threads
function chunksum(x, chunks)
    tasks = map(chunks) do r
        @spawn sum(@view x[r])
    end
    return sum(fetch, tasks)
end
x = rand(1_000_000)
ranges = Iterators.partition(eachindex(x), 100_000)
@show chunksum(x, collect(ranges))
Вопрос 17 из 30
Что нужно подтвердить отдельным примером для `@spawn sum(@view x[r])`?
JuliaJulia · Разбиение работы
using Base.Threads
function chunksum(x, chunks)
    tasks = map(chunks) do r
        @spawn sum(@view x[r])
    end
    return sum(fetch, tasks)
end
x = rand(1_000_000)
ranges = Iterators.partition(eachindex(x), 100_000)
@show chunksum(x, collect(ranges))
Вопрос 18 из 30
Какое решение устраняет риск вокруг `@spawn sum(@view x[r])`, не меняя поведение на допустимых данных?
JuliaJulia · Разбиение работы
using Base.Threads
function chunksum(x, chunks)
    tasks = map(chunks) do r
        @spawn sum(@view x[r])
    end
    return sum(fetch, tasks)
end
x = rand(1_000_000)
ranges = Iterators.partition(eachindex(x), 100_000)
@show chunksum(x, collect(ranges))
Вопрос 19 из 30
При переносе кода с `@spawn sum(@view x[r])` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
T_p\approx T_1/p+T_{sched}
Вопрос 20 из 30
Что следует сообщить пользователю библиотеки о поведении `@spawn sum(@view x[r])`?
Вопрос 21 из 30
Какой механизм Julia определяет поведение строки `BLAS.set_num_threads(1)`?
S_p\le(\sigma+(1-\sigma)/p)^{-1}
JuliaJulia · Границы применимости
using Base.Threads, LinearAlgebra
BLAS.set_num_threads(1)
function batch_norm(mats)
    out = Vector{Float64}(undef, length(mats))
    @threads for i in eachindex(mats)
        out[i] = opnorm(mats[i])
    end
    return out
end
@show batch_norm([rand(100,100) for _ in 1:8])
Вопрос 22 из 30
Что нужно подтвердить отдельным примером для `BLAS.set_num_threads(1)`?
JuliaJulia · Границы применимости
using Base.Threads, LinearAlgebra
BLAS.set_num_threads(1)
function batch_norm(mats)
    out = Vector{Float64}(undef, length(mats))
    @threads for i in eachindex(mats)
        out[i] = opnorm(mats[i])
    end
    return out
end
@show batch_norm([rand(100,100) for _ in 1:8])
Вопрос 23 из 30
Что должно остаться истинным после рефакторинга участка с `BLAS.set_num_threads(1)`?
JuliaJulia · Границы применимости
using Base.Threads, LinearAlgebra
BLAS.set_num_threads(1)
function batch_norm(mats)
    out = Vector{Float64}(undef, length(mats))
    @threads for i in eachindex(mats)
        out[i] = opnorm(mats[i])
    end
    return out
end
@show batch_norm([rand(100,100) for _ in 1:8])
Вопрос 24 из 30
При переносе кода с `BLAS.set_num_threads(1)` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
S_p\le(\sigma+(1-\sigma)/p)^{-1}
Вопрос 25 из 30
Какой тезис о `BLAS.set_num_threads(1)` можно честно закрепить в справке?
Вопрос 26 из 30
Как нужно интерпретировать `@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)`, не добавляя к коду лишних гарантий?
Q_{parallel}=Q_{reference}
JuliaJulia · Сопровождение проекта
using Base.Threads, Test
function parallel_map(f, xs)
    out = similar(xs)
    @threads for i in eachindex(xs)
        out[i] = f(xs[i])
    end
    return out
end
xs = collect(1:10_000)
@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)
Вопрос 27 из 30
Какой эксперимент отличит настоящий механизм `@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)` от случайного результата одного запуска?
JuliaJulia · Сопровождение проекта
using Base.Threads, Test
function parallel_map(f, xs)
    out = similar(xs)
    @threads for i in eachindex(xs)
        out[i] = f(xs[i])
    end
    return out
end
xs = collect(1:10_000)
@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)
Вопрос 28 из 30
Какую гарантию должна сохранить правка участка с `@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)`?
JuliaJulia · Сопровождение проекта
using Base.Threads, Test
function parallel_map(f, xs)
    out = similar(xs)
    @threads for i in eachindex(xs)
        out[i] = f(xs[i])
    end
    return out
end
xs = collect(1:10_000)
@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)
Вопрос 29 из 30
Как проверить, что новая реализация `@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)` не изменила обещанное пользователю поведение?
Q_{parallel}=Q_{reference}
Вопрос 30 из 30
Какое ограничение стоит прямо указать в документации к участку с `@test parallel_map(x -> x^2, xs) == map(x -> x^2, xs)`?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу