JuliaGPU/CUDAnative로 이징 모델 계산
소개
JuliaGPU / CUDAnative
를 시험해 보아 매우 좋았으므로, 우선 개요를 소개한다.
쓸 수 없었던 것은 다른 기사로 만들어질지도 모른다.
CUDAnative
는 CuArrays
에 비해
개발자의 최적화에 대한 언급
htps : // ぢs 이렇게 r세. 주아아 g. 오 rg / t / 쿠다 나치
JuliaGPU / ArrayFire
에서 이징 모델 계산htps : // 이 m / ㄴ ri / / ms / 3에 cb550 a f79 ~ c674에 480
※
ArrayFire
는 CuArrays
와 같은 정도로 높은 추상도의 외부 라이브러리CUDAnative
의 상세한 사용법은 보이지 않지만htps : // 기주 b. 코 m/쥬아아 G푸/쿠다나치ゔぇ. jl / t ree / ma s r / e mp ぇ s
도움이되었습니다.
이 기사의 노트북
htps://응 b비에웨r. 나무 py 손 r. 오 rg / 의 st / ぃ理 my / c825 A B9 C45C45 A 2173C52254D4802C9
이징 모델 병렬 처리
GPU 계산에서는, 다수의 코어를 이용한 병렬화에 의해 퍼포먼스를 올리고 있다.
한편, 이징 모델에서는 스핀이 인접한 스핀의 영향을 받기 때문에 인접한 스핀을 동시에 평가할 수 없다.
영향이 직접 미치지 않는 스핀이면 병렬로 평가할 수 있습니다.
스핀 전체를 격자 모양으로 칠해 색마다 교대로 평가하면 된다.
Simulation of Ising spin model using CUDA
h tp // w w.ゔぃこゔぃ c. rg/P 로지ぇcts/모두 ぇrせせ s/라d ンジぇ/2011_주리시 c. pdf
※ GPU의 성능은 CPU에 비해 50-200배의 기술 있음
CUDA 프로그래밍
GPU에서 처리 설명
GPU에서 호출되는 함수, 소위 커널을 써 갑니다.
병렬 처리 이외의 부분에 대해서는, 쿠로키현에 의한 CPU 실장을 거의 그대로 답습했다.
htps : /// b ゔぃ에우ぇr. Jupy r. 오 rg / 기 st / 겐쿠로키 / 4 46c68c56 예 0f3b1 아 6f88 c628b9d7
using CUDAnative
function _update!(s, rnd, m, n, β, white=false)
i = (blockIdx().x-1) * blockDim().x + threadIdx().x
j = (blockIdx().y-1) * blockDim().y + threadIdx().y
if i ≤ m && j ≤ n && iseven(i+j) == white
@inbounds ajs = (
s[ifelse(i+1 ≤ m, i+1, 1), j] +
s[ifelse(i-1 ≥ 1, i-1, m), j] +
s[i, ifelse(j+1 ≤ n, j+1, 1)] +
s[i, ifelse(j-1 ≥ 1, j-1, n)]
)
@inbounds prob = CUDAnative.exp_fast(-β * s[i, j] * ajs)
@inbounds s[i, j] = ifelse(rnd[i, j] < prob, -s[i, j], s[i, j])
end
return
end
GPU에서 처리 설명
GPU에서 호출되는 함수, 소위 커널을 써 갑니다.
병렬 처리 이외의 부분에 대해서는, 쿠로키현에 의한 CPU 실장을 거의 그대로 답습했다.
htps : /// b ゔぃ에우ぇr. Jupy r. 오 rg / 기 st / 겐쿠로키 / 4 46c68c56 예 0f3b1 아 6f88 c628b9d7
using CUDAnative
function _update!(s, rnd, m, n, β, white=false)
i = (blockIdx().x-1) * blockDim().x + threadIdx().x
j = (blockIdx().y-1) * blockDim().y + threadIdx().y
if i ≤ m && j ≤ n && iseven(i+j) == white
@inbounds ajs = (
s[ifelse(i+1 ≤ m, i+1, 1), j] +
s[ifelse(i-1 ≥ 1, i-1, m), j] +
s[i, ifelse(j+1 ≤ n, j+1, 1)] +
s[i, ifelse(j-1 ≥ 1, j-1, n)]
)
@inbounds prob = CUDAnative.exp_fast(-β * s[i, j] * ajs)
@inbounds s[i, j] = ifelse(rnd[i, j] < prob, -s[i, j], s[i, j])
end
return
end
GPU로 스레드 시작
@cuda
매크로로 커널을 호출한다.using Random: rand!
using CuArrays.CURAND
m = 3072
n = 4096
rnd = curand(m, n)
s = @. Int32(2 * (rnd < 0.5f0) - 1)
βc = Float32(log(1+sqrt(2)))
threads = (32, 32)
blocks = @. ceil(Int, (m, n) / threads)
# Main
for _ in 1:100
rand!(rnd)
@cuda blocks=blocks threads=threads _update!(s, rnd, m, n, βc, true)
@cuda blocks=blocks threads=threads _update!(s, rnd, m, n, βc, false)
end
CuArrays
에서 얻은 서열은 CUDAnative
커널에서 사용할 수 있습니다 갤러리
임계 온도에서의 정상 상태(정지 화상)
전체를 약 100000회 평가한 후
$4096\times3072$ 를 1/8로 축소
임계 온도에서의 정상 상태(동영상)
$4096\times3072$ 를 1/16 로 축소
전체 16회 평가/프레임
30 프레임
벤치마크
Reference
이 문제에 관하여(JuliaGPU/CUDAnative로 이징 모델 계산), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Lirimy/items/e25efa016c54d07368c8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)