20151207

1. Opening
– 61개의 accepted papers
– poster session은 화요일 오후 4시~오후 5시 30분


2. The Human Intranet – Where Swarms and Humans Meet, Prof. Jan Rabaey (UC Berkeley) (slides)
– 많은 곳에 센서와 프로세서가 붙고 있음. 이러한 센서들을 사람을 확장하는 방향으로 사용할 수 있을 것이다.
– Doug Engelbart가 1962년에 이미 사람의 확장으로 컴퓨터를 사용하는 것을 제안함(Augmenting Human Intellect). Douglas Engelbart가 수많은 컴퓨터 활용 개념을 창안했기 때문에 mother of all demos라고 불림.
augmenting human intellect.PNG
– 요즘에는 wearable의 형태로 사람의 기능을 확장하게 됨. wearable이란 무엇인가? 입는 것 뿐만 아니라, 나와 함께 이동하는 모든 것을 wearable로 정의할 수 있다.
– wearable로 무엇을 할 수 있는가? 바깥을 보는 extrospection으로 기능할 수 있다(외부를 보는 것). 안쪽을 보는 introspection으로 기능할 수 있다(내부를 보는 것 – 체중, 건강 상태 등). 감각의 확장, extension으로 기능할 수 있다(bandwidth 확장).
– brain-machine interfaces는 컴퓨터와 사람 사이의 bandwidth를 획기적으로 늘려준다.
– 하지만 현재는 gadget들이 회사에 종속적이기에 충분히 사용되고 있지 못하다. 이를 해결하기 위해서는 open platform이 필요하다.
– 이러한 sensor network가 현재에 가능한 이유: 아이디어가 충분하다는 것, 기기 소형화가 가능하다는 것 (neural dust), 전자기기가 flexible해지고 있다는 점. 여전히 어려운 점이 있다. energy를 어떻게 전달할 것인지, robustness가 충분한지, 보안성이 있는지 등의 문제가 있다.


3. Large Pages and Lightweight Memory Management in Virtualized Environments: Can You Have it Both Ways? (paper, slides)
– big-memory system에서 주소 변환 오버헤드를 줄이기 위해 large page를 사용하는 것이 일반적이다. 하지만 가상화된 시스템에서는 large page를 사용하는 것은 드물다. large page를 사용하는 것이 주소 변환 오버헤드를 줄여주지만, 가상화된 시스템에서는 작은 단위로 메모리를 관리하는 것이 효율적이기 때문이다. 이로 인해 guest VM에서는 large page로 할당된 페이지가 물리적으로 쪼개지는 경우가 많이 발생하고 있다. 이 논문에서는 이러한 문제를 해결하기 위해, 이미 쪼개진 PTE를 speculative하게 합쳐서 large page로 만들어 사용하고자 한다.
– 가상화된 시스템에서는 메모리 접근이 two-dimensional 하기 때문에 최대 24번의 메모리 접근이 필요하다. container 기반으로 가상화된 시스템에서도 TLB reach의 제약으로 주소 변환 오버헤드가 크다. large page를 사용함으로써 이러한 문제를 어느 정도 해결할 수 있다.
large pages advantages.PNG
– 하지만 가상화된 시스템에서는 memory consolidation ratio를 높이기 위해 large page를 쪼개어 관리한다. page sharing의 경우 작은 단위의 페이지를 사용했을 때에 더 효율적이다. 페이지가 작은 단위로 관리되고 있을 때에 유사한 페이지를 찾아내기 쉽고, 유사성을 비교하기도 쉽기 때문이다. NUMA의 경우에는 큰 페이지를 사용하는 것이 시스템의 성능을 저하시킬 가능성이 크다 (page migration overhead). 가상화된 시스템에서는 working set의 크기를 추정하기 위해 working set sampling을 하는데, 이 과정에서 page를 invalidate하기 때문에 large page가 쪼개질수 있다. 마지막으로 live VM migration하는 과정에서도 large page가 쪼개진다.
large pages disadvantages.PNG
– 주소 패턴을 통해 large page를 speculation하고, 이를 통해 address translation의 성능 향상을 도모한다. 서로 다른 두 개의 주소가 같은 large page에 속하는지 보기 위해 상위 26bit를 비교한다 (하위 9비트는 무시). 이미 TLB에 상위 26bit가 같은 speculative TLB entry가 있으면, speculative hit이 발생했다고 판단하고 해당하는 SPP 26bit를 가져다 사용한다.
GLUE address interpolation.PNG
– speculation은 page table walk 이후에 발생한다. L1, L2 TLB miss가 발생했다고 하자. page table walker가 page table을 확인해 SPP를 가져온다. 그리고 현재의 L1, L2 TLB에 상위 26bit가 같은 GVP가 있는지 확인한다. 있다면 speculative하게 2MB PTE를 L1, L2 TLB에 삽입한다.
– speculative하게 execution하게 되는 경우, verification은 critical path 외에서 실행된다.


4. Exploiting Commutativity to Reduce the Cost of Updates to Shared Data in Cache-Coherent Systems (paper, slides)
– cache coherent system에서는 공유 변수로 인해 병렬성이 크게 제한된다. 공유 변수의 읽기는 동시에 여러 코어가 할 수 있지만, 공유 변수에 대한 쓰기는 한 번에 하나의 코어만 할 수 있기 때문이다. 이 논문에서는 cache coherent system에서 공유 변수 업데이트로 인한 비용을 줄이기 위한 메커니즘인 COUP을 제안한다. COUP은 대부분의 연산이 commutative하다는 점을 이용한다.
– Figure: COUP comparison ([MICRO’15] Exploiting Commutativity to Reduce the Cost of Updates to Shared Data in Cache-Coherent Systems)
coup comparison
– 기존의 cache coherence protocol을 사용하면 공유 변수로 인한 cache line ping pong이 발생한다. 여러 개의 코어가 private cache에서 해당 변수에 대한 쓰기 권한을 번갈아 가져가면서, 성능이 떨어진다. 이를 해결하기 위해 remote memory operation (RMO)가 제안되었다. 각각의 코어가 private cache에서 공유 변수를 update를 하는 것이 아니라, 공유 변수를 위한 캐시 또는 메모리 컨트롤러에서 업데이트 작업을 수행하도록 하는 것이다. 하지만 이렇게 하는 경우에 모든 코어의 업데이트 메시지가 공유 변수가 있는 곳으로 몰리면서 bottleneck이 발생한다. 이러한 문제를 해결하고자 이 논문에서는 COUP을 제안한다. 대부분의 연산은 commutative하다. commutative한 연산에 대해서는 무엇이 먼저 처리되어도 결과는 동일하다. 따라서 연산을 local core에서 쌓아두고, 해당 변수에 대해 읽기가 발생할 때 reduction을 수행해 값을 결정한다.
– RMO, COUP은 software에서 공유 변수를 다루기 위해 사용되던 software 기법인 delegation, privatization과 유사하다. RMO는 delegation과 같고, COUP은 privatization과 같다. 하지만 COUP이 software적인 privatization보다 우수한 성능을 보인다. Privatization은 reduction cost가 크고, 메모리 공간을 낭비하지만 COUP은 그렇지 않기 때문이다.
– Figure: MUSI protocol ([MICRO’15] Exploiting Commutativity to Reduce the Cost of Updates to Shared Data in Cache-Coherent Systems)
coup MUSI
– 이 논문에서는 COUP을 적용하기 위해 MSI를 확장하여 MUSI를 만든다. Commutative한 연산에 대해서는 commutativity를 활용하여 병렬 처리 가능하도록 한다는 점이 핵심이다. MSI에 U 상태를 하나 더 만들어, 이 상태에서는 해당 캐시 라인에 대한 업데이트만 가능하도록 한다. 어떻게 해당 상태에 들어가고 나오는지에 대한 내용은 3.1.2 Protocol operation에 잘 설명되어 있음.
– 실제 워크로드에서 commutative한 연산이 그리 많지는 않지만, 코어 수가 많아짐에 따라 이러한 영향이 심해지므로 coup을 적용하면 높은 성능 향상을 이룰 수 있다.


5. CCICheck: Using μhb Graphs to Verify the Coherence-Consistency Interface (paper)
– coherence verifier와 consistency verifier가 따로 연구되었으나, 실제로는 연관되어 있음.
– ??? 이해하기 어려움. coherence와 consistency를 잘 확인할 수 있는 새로운 메커니즘을 만들었다는 이야기같음. 기존의 확인 기법에서 찾지 못하는 문제를 이야기하고, 이를 확인하기 위한 방법을 이야기하는 것 같았음. litmus test와 비교하고 있음.


6. HyComp: A Hybrid Cache Compression Method for Selection of Data-Type-Specific Compression Methods (slides)
– 컴퓨터 시스템에서 cache가 중요하다. 캐시 크기를 늘리는 것은 AMAT를 줄여주지만, 공간이 많이 들고, latency가 증가한다. 이를 해결하기 위해 cache compression을 사용할 수 있다.
– Figure: cache compression mechanism comparison ([MICRO’15] HyComp A Hybrid Cache Compression Method for Selection of Data-Type-Specific Compression Methods)
hycomp motivation
– 여러 가지의 cache compression technique을 비교해봤을 때, 데이터 타입에 따라 성능을 잘 내는 메커니즘이 다르다. 각 cache compression technique이 가정하는 기본 데이터 타입이 다르기 때문이다. HyComp에서는 여러 가지의 압축 기법 중에 최적의 성능을 내는 것을 선택하고자 한다 (hybrid). floating point 압축 기법도 새롭게 제시한다.
– HyComp는 여러 종류의 기법 중에 최적의 성능을 내는 것을 선택해 압축/압축 해제하지만, latency에는 영향을 주지 않는다. Integer 타입에는 SC^2, pointer에는 BDI, floating point에는 FP-H, null에는 ZCA를 적용해 압축한다.
– latency의 증가 문제가 없다면 ideal하게는 모든 기법을 적용해보고 최적의 압축 기법을 선택하는 것이 좋을 것이다. 하지만 실제로는 비용이 너무 크기 때문에 적용하지 못한다. 따라서 heuristic하게 데이터 타입을 예측한다. 한 캐시 라인을 여러 개의 8byte 단위 chunk로 쪼개고, 각 chunk가 갖는 데이터 타입을 heuristic하게 예측한다. chunk의 데이터 타입을 예측하는 방법은 논문에 나와 있음. 한 개의 캐시 라인은 8개의 chunk로 이루어지므로, dominant한 타입을 기준으로 캐시 라인에 적용할 압축 기법을 선택한다. dominant한 데이터 타입이 없으면 압축하지 않는다.
– FP-H: floating point의 exponent의 locality는 이전에 발견되어 사용되었지만, mantissa에 대한 압축은 처음 제시한다. mantissa를 쪼개면 locality가 있다는 점을 사용한다.
– 그래프 위에 음영을 주어 그룹을 묶는 방식이 깔끔하고 보기에 좋았다.


7. Doppelganger: A Cache for Approximate Computing (paper, slides)
– Figure: metaphor for the proposed mechanism ([MICRO’15] Doppelganger: A Cache for Approximate Computing)
doppelganger conventional mnmdoppelganger proposed mnm
doppelganger conventionaldoppelganger proposed
– 메모리에 직접 접근하는 것은 캐시에 접근하는 것보다 더 많은 시간과 에너지가 소모된다. LLC의 크기를 키우면 AMAT를 줄일 수 있지만, 더 많은 에너지와 면적을 소모하게 된다.
– 모든 데이터와 연산이 정확하지 않아도 된다는 것이 approximate computing. Cache에 있는 데이터를 보았더니 많은 경우에 유사하다 (motivation). Doppelganger cache에서는 캐시에서 데이터 블록의 유사성을 보고, 이를 이용해 approximate하게 압축하고자 함. 이를 사용하면 77%정도의 공간 절약이 가능하다.
– approximate computing이 적용 가능한 분야는 data mining, computer vision, audio / video processing, gaming, machine learning, dynamical simulation 등이 있을 수 있다.
– Doppelganger cache에서는 기존의 LLC를 두 개로 쪼갠다. Precise cache, Doppelganger cache로 쪼갠다. Precise cache는 기존의 캐시와 동일하게 동작하며, Doppelganger cache는 유사한 data element들을 하나의 data element로 대체한다(압축).
– 유사한 것을 같은 data element로 매핑하려면, approximately similar한 것에 대한 정의를 해야 함. 두 개의 캐시 블록이 threshold T 이내에서 값이 같다면 approximately similar 하다고 정의한다. 프로그래머가 threshold T를 정의할 수 있다고 가정하고 있다.
– Doppelganger cache의 구현: tag array, data array가 있다고 할 때, 유사한 data 값을 갖는 tag들에게 같은 map 값을 할당한다. 그리고 해당 map 값을 사용해 data array를 접근하도록 한다.
– lookup, insertion, eviction 등에 대한 것은 논문에 자세히 나와 있으며, 슬라이드의 그림만 보아도 이해가 쉬움. 직관적인 편이다.
– 서로 다른 두 개의 data element를 비교한다는 것이 쉬운 것은 아님. 캐시 내에서 유사한 data element를 찾으려면 pairwise하게 비교해야 하므로, 시간이 오래 걸리고 전력 소모가 늘어날 수 있다. 이를 해결하고자 이 논문에서는 hashing을 사용함.
– Doppelganger cache의 적용이 precise cache의 크기를 절반으로 줄이게 된다. Approximately similar한 데이터가 많으면 문제가 되지 않지만, 그렇지 않으면 성능 저하가 유발됨. 이를 해결하고자 uniDoppelganger cache를 제안함. Precise cache로 쓰고 싶을 때에는 map 값 대신에 physical address를 사용하면 된다. 그리고 tag에 precise cache로 사용할 것인지, uniDoppelganger cache로 사용할 것인지 표현하는 1bit가 필요함.
– 데이터를 M&M으로 비유해서 설명한 것이 매우 인상적이었음. 비유를 들어 설명해준 덕분에 이해가 잘 되었음.
– 슬라이드 전반적인 색감이 눈이 아프지 않고 좋았음.
– 그래프에서 어느 방향에 좋은 것인지 알려주는 것이 좋았음.
– approximation이 control flow의 변경하지 않느냐 하는 질문이 있었음. 답변은 잘 기억나지 않지만, approximation 대상 변수의 허용 범위를 프로그래머가 설정할 수 있는 경우를 가정하고 연구했으므로 문제가 없을 것으로 생각함.


8. The Application Slowdown Model: Quantifying and Controlling the Impact of Inter-Application Interference at Shared Caches and Main Memory (paper, slides)
– 멀티 코어 시스템에서는 여러 개의 어플리케이션이 동시에 실행되면서, 자원 공유로 인한 간섭을 받게 되는데, 간섭으로 인한 어플리케이션 slowdown을 추정하는 것이 성능 개선에 도움이 될 수 있다. 이 논문에서는 Application Slowdown Model (ASM)을 제안한다. ASM은 어플리케이션의 성능이 shared cache 접근 횟수와 연관성이 높다는 것에서 착안해 application slowdown을 모델링한다.
– application slowdown이란 alone 실행에서의 실행 시간에 비해, shared 실행에서의 실행 시간이 얼마나 늘어났는지로 계산할 수 있다. shared 상태에서의 실행 시간을 측정하는 것은 어렵지 않으나, alone 상태에서의 실행 시간을 측정하는 것은 쉽지 않다. application slowdown을 추정하고자 하는 선행 연구들이 있었으나, 적용하기 힘들고 부정확하다.
estimating application slowdown.PNG
– ASM에서는 online으로 shared cache와 main memory 간섭으로 인한 application slowdown을 예측하는 것을 목적으로 한다. 그리고 추가로 ASM을 사용해 성능 향상을 이룰 수 있는 예제를 제안한다. cache partitioning 메커니즘, bandwidth partitioning 메커니즘, soft slowdown 메커니즘을 제안한다.
– 선행 연구와의 비교: Stall-Tim Fair Memory scheduler(STFM)는 메모리 간섭으로 인한 stall cycle 수를 세어 slowdown을 측정한다. Memory-interference Induced Slowdown Estimation(MISE)은 메모리 요청의 memory request service rate의 변화로 slowdown을 측정한다. STFM과 MISE는 shared cache로 인한 간섭을 고려하지 않는다는 문제점이 있다. Fairness via Source Throttling(FST)과 Per-thread cycle accounting(PTCA)은 shared cache, memory 모두를 고려하는 메커니즘이다. FST와 PTCA는 contention으로 인한 cache miss를 세어 slowdown을 측정한다. 하지만 두 기법 모두 부정확하다. 병렬성을 고려하지 않으며, 하드웨어 오버헤드가 있다.
– 이 논문에서 제안하는 ASM은 application의 성능이 shared cache의 접근 횟수와 밀접한 연관이 있음에 착안한다. shared 상태에서의 성능과 alone 상태에서의 성능의 비율은, shared 상태에서의 캐시 접근 빈도와 alone 상태에서의 캐시 접근 빈도로 치환될 수 있다.
ASM motivation.PNGASM equation.PNG
– ASM에서 측정해야 하는 것은 cache access rate이다. Alone일 때와 shared 상태에서의 cache access rate을 측정해야 한다. Shared 일 때의 cache access rate의 측정은 어렵지 않다. Alone일 때의 cache access rate 측정을 위해, 일정 time quanta Q마다 각 워크로드의 alone일 때의 cache access rate을 측정한다. Alone에서의 cache access rate의 측정을 위해 메모리 대역폭과 캐시에 수정을 가한다. 우선 메모리 대역폭에서는 전체 실행 시간을 time quanta Q로 분할하고, Q 시간 내에서는 특정 어플리케이션이 memory bandwidth를 독점할 수 있도록 한다 (highest priority 줌으로써). 이를 통해 메모리 대역폭으로 인한 간섭을 제거할 수 있다. 다음으로 캐시에서의 간섭을 제거해야 하는데, 이를 위해서는 auxiliary tag를 사용한다. Alone 상태에서의 cache access rate과 기본 metric의 관계를 Section 4.2에서 상술하고 있다.
– ASM은 캐시 접근 빈도에 기반하여 slowdown model을 세우고 있으며, 이를 cache partitioning, bandwidth partitioning에 적용하면 기존의 기법보다 더 좋은 성능을 보인다.
– ASM의 강점은 더 단순한 핵심 아이디어, 그리고 줄어든 하드웨어 오버헤드에 있다고 한다. 내 생각으로는 ASM이 기존에는 보지 않았던 cache access rate을 slowdown과 연관지은 것이 큰 강점이라고 생각한다. 무엇보다도 이렇게 연관지은 것이 slowdown과 연관이 크다는 것이 중요한 것 같다.
ASM contribution.PNG
– 한편으로는 이같은 메인 아이디어는 어떻게 찾을 수 있는지 궁금하다.


9. MORC: A Manycore-Oriented Compressed Cache (slides)
– stream-based compression이 좋은 성능을 내고 있음 (LZ77, gzip, LZMA). 이미 있는 데이터를 pointing함으로써 높은 압축률 보일 수 있음. stream-based compression은 decompression의 비용이 크고, 구현이 어렵다는 문제가 있음. cache에서는 계속해서 eviction이 발생하는데, 이는 stream compression에 부적합하다.
– ?? 이해하기 어려움


10. Efficiently Prefetching Complex Address Patterns (slides)
– prefetching은 DRAM latency를 줄이기 위한 기법이다. prefetching은 일반적으로 spatial correlation을 사용한다. 일반적인 prefetcher는 regular delta pattern은 잘 탐지해내지만, irregular delta pattern은 잘 탐지해내지 못한다.
– variable length delta prefetcher를 제안한다. VLDP는 page level에서 delta를 추적한다. delta의 튜플이 다음 주소를 예측하는 prefetch table을 여러 개 구성해 이를 사용한다.
– Simics, USIMM을 사용해 실험함.
– 기존의 delta prefetcher를 확장한 것 같음.
– geometric mean을 많이 사용하고 있음.


11. Self-Contained, Accurate Precomputation Prefetching (slides)
– 최근에 많이 쓰이는 어플리케이션에 memory-bound가 많다. prefetching이 traditional remedy이지만, 최근의 워크로드는 irregular pattern이 많다. 이를 해결하기 위해서는 history-based가 아닌 precomputation-based approach를 사용하는 것이 맞다.
– 기존의 precomputation-based prefetch 있었으나, monitor & recover하는 방식으로는 예측 불가능한 성능을 낼 수밖에 없다. 이 연구에서는 accuracy 위주의 precomputation-based prefetch하고자 한다.
– Sparse-Vector Sparse-Matrix multiplication이 hard-to-predict한 성능을 보인다. sparse matrix 곱의 특성 때문이다.
– instruction에서 필요한 것만 추출해, 메모리 접근을 유추하면 precomputation으로 prefetching할 수 있다 (control flow, memory dependency를 사용).
– 그래프의 세로 축에 better 화살표를 보여주면 이해하기 편하다.


12. Confluence: Unified Instruction Supply for Scale-Out Servers
– 서버에서 latency-critical workload가 돌고 있는데, working set이 캐시보다 훨씬 크다. 이를 해결하기 위해 L1 prefetcher, multilevel BTB를 사용하고 있음.
– branch로 인해서 control flow의 discontinuity가 발생한다.
– ?? 잘 이해되지 않음. BTB와 L1 instruction cache를 synchronize함으로써 BTB 저장 공간을 효율적으로 사용한다.
– flexus를 사용해 실험함.


13. IMP: Indirect Memory Prefetcher (paper, slides)
– sparse dataset에 대한 연산이 중요해지고 있다. big data 분석에 대한 요구가 증가하기 때문이다. traditional prefetcher들은 이러한 패턴에 잘 대처하지 못한다.
– 많은 경우에 indirect memory access는 A[B[i]]의 형태로 발생하고, B의 content가 예측하기 어렵다. B의 데이터를 미리 알 수 있다면 데이터를 정확하게 prefetch할 수 있을 것이다. B[i]를 접근할 때, A[B[i+delta]]를 prefetch한다 (중요).
– indirect memory access를 detect하고, 이를 prefetch하도록 한다. 그 외에 다양한 indrect memory access에 대한 prefetch를 다루고 있다.
– graphite를 사용해 실험함. 64개의 in-order core를 사용해 실험함.
– 그래프의 바를 하나씩 차례대로 보여주는 것도 좋은 것 같다.


13. Authenticache: Harnessing Cache ECC for System Authentication (paper, slides)
– 컴퓨터 보안에 대한 아키텍쳐 지원에 대한 연구가 활발하게 이루어지고 있음. Physical unclonable functions (PUF)가 대표적인 사례이다. PUF는 실리콘의 물리적인 특징을 사용해 시스템 인증을 수행하는 방식이다. 시스템의 물리적인 특성에 개인 키를 연결시켜 사용하는 방식. PUF에 대한 연구는 많이 있었으나, 대부분의 경우 추가적인 하드웨어를 필요로 함.
– 이 논문에서는 캐시의 correctable error 수를 fingerprint로 하여 사용하고자 함. 칩 생산 과정에서 해당 칩에 대한 challenge-response pairs(CRP)를 기록해두고, 이를 사용해 나중에 인증한다.
– PUF를 평가하는 척도에는 uniqueness, reliability, identifiability, uniformity, bit-aliasing 등이 있음.
– Cache는 고밀도일 뿐 아니라, 공정 다양화로 인해 에러가 발생함. 대부분의 에러는 ECC에 의해 수정됨. Prior work에서 전압을 떨어뜨려 이러한 에러를 드러나게 할 수 있음이 연구됨([MICRO’14] Using ECC feedback to guide voltage speculation in low-voltage processors. 그리고 이렇게 발생한 에러의 수는 SW로 접근 가능하다. 이러한 에러는 persistent하고 unique한 특성을 가지므로, authentication에 사용하기에 충분하다.
– 몇 가지 challenge가 있음. 캐시의 error map이 unique하기는 하지만, 그 수가 많지는 않음. 따라서 CRP의 수가 적게 될 수 있음. 이러한 제약을 극복하고자 Manahattan distance를 도입한다. Error map이 있고, error map은 특정 좌표에 에러가 있는지 여부를 나타낸다고 하자. 이 때, 임의의 두 개의 점을 주어 가장 가까운 error point까지의 Manhattan distance를 측정한다. 두 점 중 어디가 더 큰 값을 갖느냐에 따라 0 또는 1을 반환하도록 한다.
authenticache mechanism.PNG
– 한편, 이렇게 생성한 CRP의 수가 매우 많다. 따라서 인증 서버에서는 CRP를 모두 저장하지 않고 에러만 저장해 CRP를 계산해내도록 한다.

Advertisements
Tagged with: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
Posted in 1) Memo

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Recent Posts
누적 방문자 수
  • 142,141 hits
%d bloggers like this: