Я хотел бы инициализировать 3d тензора (многомерный массив) со значениями «по диагонали Gaussian»Быстрая тензор инициализация в Джулии
exp(-32*(u^2 + 16*(v^2 + w^2)))
где u = 1/sqrt(3)*(x+y+z)
и v,w
являются любыми две координатами ортогональных u
, дискретизирован на равномерной сетке на [-1,1]^3
. Следующий код обеспечивает:
function gaussian3d(n)
q = qr(ones(3,1), thin=false)[1]
x = linspace(-1.,1., n)
p = Array(Float64,(n,n,n))
square(x) = x*x
[email protected] 3 i p begin
@inbounds p[i_1,i_2,i_3] =
exp(
-32*(
square(q[1,1]*x[i_1] + q[2,1]*x[i_2] + q[3,1]*x[i_3])
+ 16*(
square(q[1,2]*x[i_1] + q[2,2]*x[i_2] + q[3,2]*x[i_3]) +
square(q[1,3]*x[i_1] + q[2,3]*x[i_2] + q[3,3]*x[i_3])
)
)
)
end
return p
end
Это, однако, довольно медленно. Например, если я заменяю определяющую функцию exp(x*y*z)
, код работает быстрее на 50 раз. Кроме того, макрос @time
сообщает ~ 20% GC-времени для вышеуказанного кода, который я не понимаю, откуда они. (Эти числовые значения были получены с n = 128
.) Мои вопросы поэтому
- Как я могу ускорить этот кусок кода?
- Где скрыто выделение памяти, которое вызывает накладные расходы GC?
Попробуйте определить свою функцию '' square'' в области верхнего уровня или уровня модуля. Внутренние функции недостаточно оптимизированы. – mlubin
Определение 'square' на верхнем уровне, похоже, несколько увеличивает производительность, но коэффициент усиления лишь немного превышает неопределенность в сроках. – gTcV
Просто любопытно, есть ли применение для этого тензора? Исключительно маленькие значения * и * охватывают сотни порядков. – rickhg12hs