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

Вычисления на GPU

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 85 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 30
Какое утверждение точнее всего объясняет участок с `@show typeof(y) sum(Array(y[1:10]))`?
x\in\mathrm{DeviceMemory}
JuliaJulia · Массивы GPU
using CUDA
x = CUDA.rand(Float32, 1_000_000)
y = @. 2f0*x + sin(x)
@show typeof(y) sum(Array(y[1:10]))
Вопрос 2 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `@show typeof(y) sum(Array(y[1:10]))`?
JuliaJulia · Массивы GPU
using CUDA
x = CUDA.rand(Float32, 1_000_000)
y = @. 2f0*x + sin(x)
@show typeof(y) sum(Array(y[1:10]))
Вопрос 3 из 30
Какое решение устраняет риск вокруг `@show typeof(y) sum(Array(y[1:10]))`, не меняя поведение на допустимых данных?
JuliaJulia · Массивы GPU
using CUDA
x = CUDA.rand(Float32, 1_000_000)
y = @. 2f0*x + sin(x)
@show typeof(y) sum(Array(y[1:10]))
Вопрос 4 из 30
Как проверить, что новая реализация `@show typeof(y) sum(Array(y[1:10]))` не изменила обещанное пользователю поведение?
x\in\mathrm{DeviceMemory}
Вопрос 5 из 30
Какое ограничение стоит прямо указать в документации к участку с `@show typeof(y) sum(Array(y[1:10]))`?
Вопрос 6 из 30
Какое объяснение для `@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)` выдержит проверку на другом допустимом входе?
i=(b-1)t+j
JuliaJulia · Ядра вычислений GPU
using CUDA
function saxpy_kernel!(y, a, x)
    i = (blockIdx().x - 1) * blockDim().x + threadIdx().x
    if i <= length(y)
        @inbounds y[i] = a*x[i] + y[i]
    end
    return
end
x = CUDA.rand(Float32, 1024); y = CUDA.ones(Float32, 1024)
@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)
synchronize()
@show sum(Array(y[1:8]))
Вопрос 7 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)`?
JuliaJulia · Ядра вычислений GPU
using CUDA
function saxpy_kernel!(y, a, x)
    i = (blockIdx().x - 1) * blockDim().x + threadIdx().x
    if i <= length(y)
        @inbounds y[i] = a*x[i] + y[i]
    end
    return
end
x = CUDA.rand(Float32, 1024); y = CUDA.ones(Float32, 1024)
@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)
synchronize()
@show sum(Array(y[1:8]))
Вопрос 8 из 30
Какую гарантию должна сохранить правка участка с `@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)`?
JuliaJulia · Ядра вычислений GPU
using CUDA
function saxpy_kernel!(y, a, x)
    i = (blockIdx().x - 1) * blockDim().x + threadIdx().x
    if i <= length(y)
        @inbounds y[i] = a*x[i] + y[i]
    end
    return
end
x = CUDA.rand(Float32, 1024); y = CUDA.ones(Float32, 1024)
@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)
synchronize()
@show sum(Array(y[1:8]))
Вопрос 9 из 30
Какой результат приёмочного теста подтвердит корректность участка с `@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)`?
i=(b-1)t+j
Вопрос 10 из 30
Какое ограничение стоит прямо указать в документации к участку с `@cuda threads=256 blocks=cld(length(x), 256) saxpy_kernel!(y, 2f0, x)`?
Вопрос 11 из 30
Что именно следует из фрагмента с `out[i] = parse(Float32, string(x[i]))`?
i\le n
JuliaJulia · Ограничения кода
using CUDA
function bad_kernel!(out, x)
    i = threadIdx().x
    i <= length(out) || return
    out[i] = parse(Float32, string(x[i]))
    return
end
x = CUDA.ones(Float32, 32); out = similar(x)
# string/parse не являются допустимой операцией kernel.
Вопрос 12 из 30
Какой тест точнее всего зафиксирует границу поведения `out[i] = parse(Float32, string(x[i]))`?
JuliaJulia · Ограничения кода
using CUDA
function bad_kernel!(out, x)
    i = threadIdx().x
    i <= length(out) || return
    out[i] = parse(Float32, string(x[i]))
    return
end
x = CUDA.ones(Float32, 32); out = similar(x)
# string/parse не являются допустимой операцией kernel.
Вопрос 13 из 30
Какой контракт следует закрепить при переработке строки `out[i] = parse(Float32, string(x[i]))`?
JuliaJulia · Ограничения кода
using CUDA
function bad_kernel!(out, x)
    i = threadIdx().x
    i <= length(out) || return
    out[i] = parse(Float32, string(x[i]))
    return
end
x = CUDA.ones(Float32, 32); out = similar(x)
# string/parse не являются допустимой операцией kernel.
Вопрос 14 из 30
Две реализации участка с `out[i] = parse(Float32, string(x[i]))` совпадают на обычных данных. Что необходимо проверить перед выпуском?
i\le n
Вопрос 15 из 30
Что следует сообщить пользователю библиотеки о поведении `out[i] = parse(Float32, string(x[i]))`?
Вопрос 16 из 30
Какое объяснение для `x_gpu = CuArray($x_cpu)` выдержит проверку на другом допустимом входе?
T=T_{H2D}+T_{kernel}+T_{D2H}
JuliaJulia · Передача памяти
using CUDA, BenchmarkTools
x_cpu = rand(Float32, 1_000_000)
t = @belapsed begin
    x_gpu = CuArray($x_cpu)
    y_gpu = sin.(x_gpu)
    Array(y_gpu)
end
@show t
Вопрос 17 из 30
Какой контрольный тест лучше всего проверит правило, связанное с `x_gpu = CuArray($x_cpu)`?
JuliaJulia · Передача памяти
using CUDA, BenchmarkTools
x_cpu = rand(Float32, 1_000_000)
t = @belapsed begin
    x_gpu = CuArray($x_cpu)
    y_gpu = sin.(x_gpu)
    Array(y_gpu)
end
@show t
Вопрос 18 из 30
Какое требование к `x_gpu = CuArray($x_cpu)` важнее удобной детали текущей реализации?
JuliaJulia · Передача памяти
using CUDA, BenchmarkTools
x_cpu = rand(Float32, 1_000_000)
t = @belapsed begin
    x_gpu = CuArray($x_cpu)
    y_gpu = sin.(x_gpu)
    Array(y_gpu)
end
@show t
Вопрос 19 из 30
После обновления Julia или пакета поведение участка с `x_gpu = CuArray($x_cpu)` изменилось. Какой критерий приёмки остаётся корректным?
T=T_{H2D}+T_{kernel}+T_{D2H}
Вопрос 20 из 30
Какое утверждение о `x_gpu = CuArray($x_cpu)` является переносимым правилом, а не особенностью одного запуска?
Вопрос 21 из 30
Какой механизм Julia определяет поведение строки `function energy(x::AbstractArray)`?
f(::AbstractArray)
JuliaJulia · Совместимость и переносимость
using GPUArraysCore
function energy(x::AbstractArray)
    return sum(abs2, x)
end
cpu = rand(Float32, 1000)
@show energy(cpu)
# Тот же контракт может использовать CuArray или другой backend-массив.
Вопрос 22 из 30
Какой тест точнее всего зафиксирует границу поведения `function energy(x::AbstractArray)`?
JuliaJulia · Совместимость и переносимость
using GPUArraysCore
function energy(x::AbstractArray)
    return sum(abs2, x)
end
cpu = rand(Float32, 1000)
@show energy(cpu)
# Тот же контракт может использовать CuArray или другой backend-массив.
Вопрос 23 из 30
Какой контракт следует закрепить при переработке строки `function energy(x::AbstractArray)`?
JuliaJulia · Совместимость и переносимость
using GPUArraysCore
function energy(x::AbstractArray)
    return sum(abs2, x)
end
cpu = rand(Float32, 1000)
@show energy(cpu)
# Тот же контракт может использовать CuArray или другой backend-массив.
Вопрос 24 из 30
После обновления Julia или пакета поведение участка с `function energy(x::AbstractArray)` изменилось. Какой критерий приёмки остаётся корректным?
f(::AbstractArray)
Вопрос 25 из 30
Что следует сообщить пользователю библиотеки о поведении `function energy(x::AbstractArray)`?
Вопрос 26 из 30
Что именно следует из фрагмента с `@test gpu ≈ cpu rtol=1f-5`?
\lVert y_{gpu}-y_{cpu}\rVert\le\tau
JuliaJulia · Стратегия тестирования
using CUDA, Test
CUDA.functional() || @info "GPU tests skipped: CUDA unavailable"
if CUDA.functional()
    x = rand(Float32, 257)
    cpu = x.^2 .+ 1
    gpu = Array(CuArray(x).^2 .+ 1)
    @test gpu ≈ cpu rtol=1f-5
end
Вопрос 27 из 30
Какой тест точнее всего зафиксирует границу поведения `@test gpu ≈ cpu rtol=1f-5`?
JuliaJulia · Стратегия тестирования
using CUDA, Test
CUDA.functional() || @info "GPU tests skipped: CUDA unavailable"
if CUDA.functional()
    x = rand(Float32, 257)
    cpu = x.^2 .+ 1
    gpu = Array(CuArray(x).^2 .+ 1)
    @test gpu ≈ cpu rtol=1f-5
end
Вопрос 28 из 30
Какую гарантию должна сохранить правка участка с `@test gpu ≈ cpu rtol=1f-5`?
JuliaJulia · Стратегия тестирования
using CUDA, Test
CUDA.functional() || @info "GPU tests skipped: CUDA unavailable"
if CUDA.functional()
    x = rand(Float32, 257)
    cpu = x.^2 .+ 1
    gpu = Array(CuArray(x).^2 .+ 1)
    @test gpu ≈ cpu rtol=1f-5
end
Вопрос 29 из 30
Как проверить, что новая реализация `@test gpu ≈ cpu rtol=1f-5` не изменила обещанное пользователю поведение?
\lVert y_{gpu}-y_{cpu}\rVert\le\tau
Вопрос 30 из 30
Как сформулировать границу механизма `@test gpu ≈ cpu rtol=1f-5` без чрезмерного обещания?

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

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

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

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