<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ComSys_jh</title>
    <link>https://comsys-pim.tistory.com/</link>
    <description>Computer architecture &amp;amp; System Software
Computer Hardware engineering (AI) #PIM</description>
    <language>ko</language>
    <pubDate>Sat, 1 Aug 2026 01:37:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>H/W engineer_ beginner</managingEditor>
    <image>
      <title>ComSys_jh</title>
      <url>https://tistory1.daumcdn.net/tistory/5149106/attach/5b73946ad22c45a5acb16917e2581534</url>
      <link>https://comsys-pim.tistory.com</link>
    </image>
    <item>
      <title>Near-Memory processing vs In-Memory processing</title>
      <link>https://comsys-pim.tistory.com/16</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 포스팅은 향후 장기적으로 진행될 Processing In Memory 연구의 Base line을 위해 정리한 내용입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PIM이 왜 중요한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;대한민국 정부에서는 인공지능 반도체 선도국가 도약을 위한 초격차 기술 중 하나로 Processing-In Memory(PIM)을 선정하였습니다. 대한민국 뿐 만 아니라 많은 국가의 일류 반도체 기업과 학계에서는 PIM을 주목하고 있는데, 그 이유는 무엇일까요? 일반적으로 컴퓨터에서 가장 중요한 두 가지를 고르라고 한다면 연산을 처리하는 Processing unit과, 처리할 연산 정보를 가져오고 다시 저장하는 공간인 Memory를 선택할 것입니다. 컴퓨터와 반도체 기술이 지금처럼 발달하기 전에는 연산을 처리하는 Processing unit 자체의 성능 혹은 Memory 자체의 성능에 의해 전체 시스템 성능이 좌지우지 되었지만, 이 둘의 기술이 극도로 발전함에 따라 이 두 장치 사이에서 발생하는 데이터의 이동이 시스템 전체 성능에 큰 영향을 미치게 되었습니다. 또한 AI기술의 발달로 정말 많은 양의 데이터 이동이 필요해졌으며, 엄청난 양의 데이터 이동은 곧 큰 전력소모로 이어지기 때문에, 저전력 고효율 환경을 구축해야 하는 서버 등에서 새로운 아키텍쳐의 도입의 필요성이 제기되었습니다. PIM은 이런 상황을 타파할 수 있는 대안 중 하나로 제시되었으며, 현재 산업계와 학계에서 정말 활발히 연구되고 있는 분야 중 하나입니다. PIM이란 Processing-In Memory의 약자로 메모리와 연산 처리 장치를 매우 가까운 위치, 혹은 동일한 공간 상에 위치 시켜 두 장치간 데이터 이동으로 발생하는 오버헤드 및 전력 소비를 획기적으로 줄이는 기술입니다. 저는 본 기술이 앞으로 대한민국 반도체 기술을 선도할 수 있는 핵심 기술이 될 것이라 판단하였고 석사 연구 프로젝트의 주제로 PIM을 선택하였습니다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;PIM 기술을 선도하기 위해서는 근본적으로 차세대 메모리 기술이 필수적입니다. 대한민국 정부가 본 기술에 더욱 주목하는 이유는 바로 차세대 메모리 반도체를 만들 수 있는 기업이 우리나라에 두 군데나 있기 때문입니다. (삼*전자, S*하이닉스)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PIM 연구를 진행하기 전 정립해야할 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;어떤 연구든 정확한 표현의 모호함과 적합한 용어 사용 아주 중요, PIM처럼 최근 활발하게 연구가 시작되는 분야는 더욱이 중요함 그래서 용어 사용과 관련하여 확실한 정립이 선행되어야 함 =&amp;gt; Near Memory computing, In Memory computing ~~&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Near-Memory computing과 In-Memory computing을 구분해야 하는 이유는 무엇인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;그림 제작하여 예시로 설명하고 표 및 비교 자료를 첨부하여 상세하고 명확하게 설명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;______________________(작성중 22.06.27)___________________________&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;I. Near-Memory processing&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;II. In-Memory processing&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;+ Optimizing / Generel purpose&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Reference&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[1] &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Khoram, S., Zha, Y., Zhang, J., &amp;amp; Li, J. (2017, March). Challenges and opportunities: From near-memory computing to in-memory computing. In&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;Proceedings of the 2017 ACM on International Symposium on Physical Design&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(pp. 43-46).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[2] 한국과학기술기획평가원, ｢2020년도 예비타당성조사 보고서 PIM 인공지능반도체 핵심기술 개발사업&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;｣&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>PIM/Study</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/16</guid>
      <comments>https://comsys-pim.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 11 Jul 2022 16:43:34 +0900</pubDate>
    </item>
    <item>
      <title>Zsim + Ramulator (PIM simulator)</title>
      <link>https://comsys-pim.tistory.com/15</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;br /&gt;Zsim + Ramulaotor 는 Processing-in-Memory(PIM) 을 시뮬레이션 할 수 있는 프레임워워크로 향후 장기적으로 진행할 PIM 관련 연구의 Base line을 설정하기 위하여 정리했습니다.&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;I. Introduction&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Zsim+Ramulator 은 General-purpose processing-in-memory (PIM) 아키텍쳐를 시뮬레이션 하기 위한 빠르고 유연한 프레임워크 입니다. Ramulator-PIM으로도 불리는 이 프레임워크는 널리 사용되고 있는 두 시뮬레이터(*&lt;u&gt;Zsim&lt;/u&gt;, *&lt;u&gt;Ramulator&lt;/u&gt;)를 기반으로 만들어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;이 프레임워크의 Computing system에는 host CPU core와 General-purpose PIM core가 있습니다. PIM core들은 Ramulator의 HMC model (3D-stacked memory)안에 위치해 있으며, 시뮬레이션을 통해 두 종류의 core에서 실행되는 어플리케이션의 성능 차이를 확인할 수 있습니다. 즉, 동일한 프로그램을 CPU core 만을 사용하거나, General-purpose PIM core만을 사용해 시뮬레이션 하고 이 둘의 성능 차이를 확인할 수 있습니다. 이를 통해 여러 Benchmark program들을 두가지 옵션으로 실행하고 성능의 차이가 큰 프로그램들을 분류하여 분류된 프로그램들의 특징을 분석해보려 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;본 시뮬레이터에서 ZSim은 Ramulator에 보낼 Memory trace를 생성합니다. PIM의 성능 측정을 위해 기존의 ZSim을 변형하여 두 가지 타입의 Memory trace가 생성되는데, 이들은 각각 host CPU trace를 위한 *&lt;u&gt;Filtered traces&lt;/u&gt;와 PIM core를 위한 *&lt;u&gt;Unfiltered traces&lt;/u&gt;로 불립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Ramulator는 ZSim을 통해 생성된 Filtered traces와 Unfiltered traces를 사용하여 두 코어의 메모리 엑세스를 시뮬레이션 합니다. 본 시뮬레이터에서는 PIM core를 시뮬레이션 하기 위해 Off-chip link overhead 를 피할수 있도록 수정되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMhYS2/btrFpPEAgf8/Yov29R1nEFduknkIu2JFY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMhYS2/btrFpPEAgf8/Yov29R1nEFduknkIu2JFY0/img.png&quot; data-alt=&quot;Figure 1 [Repository Structure of Zsim+Ramulator] / Reference [1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMhYS2/btrFpPEAgf8/Yov29R1nEFduknkIu2JFY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMhYS2%2FbtrFpPEAgf8%2FYov29R1nEFduknkIu2JFY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;420&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 1 [Repository Structure of Zsim+Ramulator] / Reference [1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;Zsim&lt;/b&gt;: 널리 사용되는 x86-64 멀티코어 시뮬레이터 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;Ramulator&lt;/b&gt;: DDRx, LPDDRx, GDDRx, WIOx, HBMx 등을 포함한 여러 DRAM 아키텍쳐가 포함된 DRAM 시뮬레이터 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;Filtered traces&lt;/b&gt;: 메모리 컨트롤러의 요청에 의해 수집되는 정보로, host의 캐시 계층구조가 ZSim 내부에서 시뮬레이션 됩니다. ZSim을 통해 *&lt;u&gt;Hardware prefetcher&lt;/u&gt; 또한 시뮬레이션 될 수 있습니다. (host CPU core를 위한 memory trace)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;Unfitered traces&lt;/b&gt;: 코어 파이프라인에서 Issue되는 즉시 모든 메모리 Request를 수집하는 방법입니다. (PIM core를 위한 memory trace)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&lt;b&gt;Hardware prefetcher&lt;/b&gt;: Software prefetch 처럼 캐시 블록을 인위적으로 제어하는 것이 아니라 하드웨어가 자동으로 프리패치 기능을 수행하는 것으로, 프로세서의 요청에 예상되는 메모리 블록을 미리 캐시에 페치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;II. Setup&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;i) Installing&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ZSim과 Ramulator 모두를 사용하는 본 시뮬레이터를 사용하기 위하여 각 시뮬레이터의 Dependency들을 맞춰 설치하는 작업이 필요했습니다. 이를 위해 각 시뮬레이터의 Git hub Readme.md 의 설명을 참고하였으며 &quot;Git clone&quot; 명령으로 원하는 경로에 설치 파일들을 로드하는 것으로 시뮬레이터 설치를 시작할 수 있습니다. 본 시뮬레이터에서 설명하는 Dependency는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;* ZSim: gcc &amp;gt;=4.6, &lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;pin, scons, libconfig, libhdf5, libelfg0&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;* Ramulator: C++11 compiler (e.g Clang++, g++-5)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;필요한 라이브러리들은 본 시뮬레이터의 setup.sh, compile.sh, make file에 모두 있으므로 설치 과정에서 컴파일러를 적합한 버젼으로 설정하는 것과 에러가 발생하는 특정 라이브러리가 맞는 버젼으로 설치될 수 있도록 수정하는 것 정도로 설치를 마무리 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ii) Trouble shooting&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(1) 'sh compile.sh' 명령어 입력 시 에러 발생 (&lt;i&gt;&lt;u&gt;aclocal-1.15 is missing on your system&lt;/u&gt;)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;=&amp;gt; 'sudo apt install automake-1.15' 명령어 입력으로 해결하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(2) 'ramulator make' 명령어 입력 시 에러 발생 (&lt;i&gt;&lt;u&gt;'~' can not be used when making a PIE object&lt;/u&gt;&lt;/i&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;=&amp;gt; 본 에러는 make file의 컴파일러 버젼과 설치되는 리눅스 환경의 컴파일러 버젼이 달라 발생하는 에러로 판단됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;=&amp;gt; ramulator directory 내부에 위치한 make file을 열어서 적합한 컴파일러 버젼을 입력 (CXX := g++5로 변경)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;=&amp;gt; 터미널에서 'sudo update-alternatives --config g++/gcc' 명령어를 통해 모든 컴파일러 버젼 5로 맞춘 후 정상 동작하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;III. How to use?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;i) Generating Traces with Zsim&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;ZSim에서 Trace를 생성하기 위해선 세 가지 단계가 필요합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. zsim-ramulator/misc/hooks/zsim_hooks.h 경로의 파일 내부 코드를 참고하여 어플리케이션에서 측정할 코드 구역을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. ZSim을 위한 Configuration file들을 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 실행 파일을 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;각 단계의 세부 사항은 아래에 정리했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;1. zsim-ramulator/misc/hooks/zsim_hooks.h 경로의 파일 내부 코드를 참고하여 어플리케이션에서 측정할 코드 구역을 설정합니다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;먼저 어플리케이션에서 관심 있는 부분의 코드를 지정합니다. 본 시뮬레이터에서는 이 부분이 'offload region' 이라는 용어로 통용됩니다. 지정한 Region의 code는 PIM Core에서 실행되며 자세한 설명은 밑에 첨부한 코드를 참고 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;#include &quot;zsim-ramulator/misc/hooks/zsim_hooks.h&quot;
foo(){
    /*
    * zsim_roi_begin() marks the beginning of the region of interest (ROI).
    * It must be included in a serial part of the code.
    */
	zsim_roi_begin(); 
	zsim_PIM_function_begin(); // Indicates the beginning of the code to simulate (hotspot).
	...
	zsim_PIM_function_end(); // Indicates the end of the code to simulate.
    /*
    * zsim_roi_end() marks the end of the ROI. 
    * It must be included in a serial part of the code. 
    */
	zsim_roi_end(); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;2. ZSim을 위한 Configuration file들을 만듭니다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;Configuration file들은 Zsim으로 Application들을 실행시킬 때 사용됩니다. 본 시뮬레이터에서는 Filtered trace와 Unfiltered trace를 위한 Sample code 들을 zsim-ramulator/tests 경로에서 제공합니다. 이 샘플 코드들을 통해 Core의 갯수, 캐쉬 메모리의 사이즈와 갯수, Prefetcher의 갯수 등을 어떻게 설정하는지 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;*Filtered configuration files: host.cfg, host_prefetch.cfg&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;*Unfiltered configuration file: pim.cfg&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MinFG/btrFsfKQGVY/r6hbM076vNKBWuApP2MKFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MinFG/btrFsfKQGVY/r6hbM076vNKBWuApP2MKFK/img.png&quot; data-alt=&quot;Figure 2 [Important nobs that can be changed in the configuration files]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MinFG/btrFsfKQGVY/r6hbM076vNKBWuApP2MKFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMinFG%2FbtrFsfKQGVY%2Fr6hbM076vNKBWuApP2MKFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;198&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 2 [Important nobs that can be changed in the configuration files]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;3. 실행 파일을 실행합니다.&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;* Trace 생성 명령어&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;./build/opt/zsim configuration_file.cfg&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;*Trace format&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;THREAD_ID PROCESSOR_ID INSTR_NUM TYPE ADDRESS SIZE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXGFb8/btrFoQrAiu2/NdhmjsVdu7NYuo8a44krfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXGFb8/btrFoQrAiu2/NdhmjsVdu7NYuo8a44krfk/img.png&quot; data-alt=&quot;Figure 3 [The fileds in the trace file]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXGFb8/btrFoQrAiu2/NdhmjsVdu7NYuo8a44krfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXGFb8%2FbtrFoQrAiu2%2FNdhmjsVdu7NYuo8a44krfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1257&quot; height=&quot;265&quot; data-origin-width=&quot;1257&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 3 [The fileds in the trace file]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;**간단하게 요약하자면, 먼저 원하는 Application을 Compile한 후에 ZSim으로 어플리케이션에 대한 Configuration file을 생성해줍니다. Configuration file은 앞서 설명했듯, host CPU core를 위한 두 개의 파일과 PIM core를 위한 한 개의 파일로 구성되어 있습니다. 그 다음 './build/opt/zsim configuration_file' 명령어를 입력하여 Trace file들을 생성해 줍니다. 생성된 Trace file들은 Ramulator를 실행 할 때 사용되게 됩니다.&lt;u&gt;&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ii) Running Ramulator&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) To run the host simulation:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;./ramulator --config Configs/host.cfg --disable-perf-scheduling true --mode=cpu --stats host.stats --trace sample_traces/host/rodiniaBFS.out --core-org=outOrder --number-cores=4 --trace-format=zsim --split-trace=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) To run the PIM simulation:&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;./ramulator --config Configs/pim.cfg --disable-perf-scheduling true --mode=cpu --stats pim.stats --trace sample_traces/pim/pim-rodiniaBFS.out --core-org=outOrder --number-cores=4 --trace-format=zsim --split-trace=true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* mode 설정을 위해서 Configuration file 내부에 pim_mode 값을 지정해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; pim_mode = 0 (for host)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; pim_mode = 1 (for pim)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvVSJe/btrFsYI6BV0/CexFaKqQ1EOqH62kKi1ln1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvVSJe/btrFsYI6BV0/CexFaKqQ1EOqH62kKi1ln1/img.png&quot; data-alt=&quot;Figure 4 [The important nobs for running ramulator]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvVSJe/btrFsYI6BV0/CexFaKqQ1EOqH62kKi1ln1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvVSJe%2FbtrFsYI6BV0%2FCexFaKqQ1EOqH62kKi1ln1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;248&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Figure 4 [The important nobs for running ramulator]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IV. Reference&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] &lt;a href=&quot;https://github.com/CMU-SAFARI/ramulator-pim&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/CMU-SAFARI/ramulator-pim&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1655709458841&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - CMU-SAFARI/ramulator-pim: A fast and flexible simulation infrastructure for exploring general-purpose processing-in-mem&quot; data-og-description=&quot;A fast and flexible simulation infrastructure for exploring general-purpose processing-in-memory (PIM) architectures. Ramulator-PIM combines a widely-used simulator for out-of-order and in-order pr...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CMU-SAFARI/ramulator-pim&quot; data-og-url=&quot;https://github.com/CMU-SAFARI/ramulator-pim&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDwg5X/hyOOvwAgLD/0nKw6aMyejnKChWKesNWZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/CMU-SAFARI/ramulator-pim&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CMU-SAFARI/ramulator-pim&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDwg5X/hyOOvwAgLD/0nKw6aMyejnKChWKesNWZk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - CMU-SAFARI/ramulator-pim: A fast and flexible simulation infrastructure for exploring general-purpose processing-in-mem&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A fast and flexible simulation infrastructure for exploring general-purpose processing-in-memory (PIM) architectures. Ramulator-PIM combines a widely-used simulator for out-of-order and in-order pr...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2] &lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;Yoongu Kim, Weikun Yang, and Onur Mutlu, &quot;&lt;/span&gt;&lt;a href=&quot;https://people.inf.ethz.ch/omutlu/pub/ramulator_dram_simulator-ieee-cal15.pdf&quot;&gt;Ramulator: A Fast and Extensible DRAM Simulator&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&quot;. IEEE Computer Architecture Letters (CAL), March 2015.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[3] &lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;Gagandeep Singh, Juan Gomez-Luna, Giovanni Mariani, Geraldo Francisco de Oliveira, Stefano Corda, Sander Stujik, Onur Mutlu, and Henk Corporaal, &quot;&lt;/span&gt;&lt;a href=&quot;https://people.inf.ethz.ch/omutlu/pub/NAPEL-near-memory-computing-performance-prediction-via-ML_dac19.pdf&quot;&gt;NAPEL: Near-Memory Computing Application Performance Prediction via Ensemble Learning&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f;&quot;&gt;&quot;. Proceedings of the 56th Design Automation Conference (DAC), Las Vegas, NV, USA, June 2019.&lt;/span&gt;&lt;/p&gt;</description>
      <category>SImulator and Benchmark/Zsim+ramulator (PIM simulator)</category>
      <category>PIM #zsim #ramulaotor</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/15</guid>
      <comments>https://comsys-pim.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 20 Jun 2022 17:02:52 +0900</pubDate>
    </item>
    <item>
      <title>[IEEE.2020] Planaria: Dynamic architecture fission for spatial multi-tenant acceleration of deep neural networks.</title>
      <link>https://comsys-pim.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Ghodrati, Soroush, et al. &quot;Planaria: Dynamic architecture fission for spatial multi-tenant acceleration of deep neural networks.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;2020 53rd Annual IEEE/ACM International Symposium on Microarchitecture (MICRO)&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;. IEEE, 2020.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 논문은 진행중인 Auto Driving 관련 프로젝트의&lt;br /&gt;Insight를 위해 읽었기 때문에&lt;br /&gt;필요한 내용만 간추려 요약하였습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Abstract&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Deep Neural Networks(DNNs)이 실생활의 많은 Application에서 사용됨에 따라 빠른 속도로 산업과 시장에 적용되었습니다. 기술이 발전함에 따라, *Inference-as-a-Service(INFaaS)를 제공하는 Cloud 인프라와 AI accelerator는 업계에 혁신적인 변화를 가져 왔습니다. 그 결과 대부분의 INFaaS 기반 Accelerators들은 (ex. Google's TPU, NVIDIA T4,&amp;nbsp; Microsift Brainwave 등) 많은 Real-life application들의 중추적인 역할을 담당하게 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Multi-tenancy 환경에 대한 수요가 Datacenter의 물리적 확장을 이끌었지만, 다양한 Application의 방대한 data들을 효율적으로 처리하기 위하여 단순히 가속기의 수를 늘리는 것은 경제적이지 않습니다. 단순히 더 빠른 속도와 효율성을 위한 경쟁으로 인해 Multi-tenancy 환경에 적합한 DNN Accelerator를 설계하는 것에 대해서는 아직 많은 연구가 필요한 상황입니다. 따라서 이번 연구에서 'Dynamic architecture fission(break)' 으로 불리는 새로운 기술을 적용하였습니다. 위의 기술을 적용하여 여러 DNN models들을 새로운 Demension들로 동적으로 분할하고 재연결했으며, Multitenancy 에 적합한 새로운 DNN runtime engine인 'Planaria' 를 제안합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 새로운 Microarchitecture를 통하여 동일한 Hardware 공간에서 여러 DNN Inference serveices들을 공간 효율적으로 배치할 수 있으며, Multi-tenant DNN을 가속할 수 있습니다. 이를 위하여 먼저, DNN 가속을 위하여 분할 가능한 omni-directional systolic array를 찾습니다. 그 다음, Systolic array 기반의 DNN accelerator가 정상적으로 분할 될 수 있도록 Planaria만의 독특한 구성을 사용합니다. (On-chip memory과 Computer resource 간의 상호 연결 구성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Architecture 수준에서의 분할과 연결 유연성은 Task 기반 Scheduling이 더 자유롭게 이루어질 수 있도록 합니다. 이를 통해 Scheduler는 가속기를 Server load, DNN topology, task priority 등을 고려할 수 있게 됩니다. 이를 통하여 가속기에서 Multi DNN 실행 시 Throughput, Utilization, QOS, Fairness 등을 향상 시킬 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*INFaaS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Inference as a service &lt;span style=&quot;background-color: #ffffff;&quot;&gt;provides a core set of common functionality required to develop various context-aware apps&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;: &lt;span style=&quot;background-color: #ffffff;&quot;&gt;INFaaS 안에 사용 가능한 Solution이 존재한다면&lt;/span&gt; 개발자는 Training data를 직접 넣지 않아도 되며, 구체적인 model을 구축하지 않아도 됩니다. 자세한 내용은 아래 그림을 참조해 주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HFuq6/btrsMdZEOVa/kv6vqYysEkJt86Mg684PgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HFuq6/btrsMdZEOVa/kv6vqYysEkJt86Mg684PgK/img.png&quot; data-alt=&quot;[Figure 1] Process of Situation Inference in Tradition way and INFaaS.Ref[1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HFuq6/btrsMdZEOVa/kv6vqYysEkJt86Mg684PgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHFuq6%2FbtrsMdZEOVa%2Fkv6vqYysEkJt86Mg684PgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;367&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] Process of Situation Inference in Tradition way and INFaaS.Ref[1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Introduction&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;인공지능 산업이 발전함에 따라 더 빠르고 효율적인 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN execution&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 필요성이 증가했고 이는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN Accelerator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 등장으로 이어졌습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. (Google&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;TPU, NVIDIA&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;T4, Microsoft&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Brainwave &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;등&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 빠른 속도와 효율성 증대를 위한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;arms&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;race&amp;rsquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라 불리는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;market&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서의 경쟁에 치중한 나머지&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Multi-tenancy &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경에 최적화 된 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Microarchitecture&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 설계하는 것에 대한 연구와 노력이 부족한 상황입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. 조사에 따르면 Datacenter 에서의 Hardware utilization 은 50%정도에 그치며, 이는 심각한 자원의 낭비를 초래합니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;때문에 본 논문에서는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lsquo;Planaria&amp;rsquo;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라는 이름의 새로운 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;microarchitecture mechanism&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 제안합니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이어&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;설명하겠지만 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Planaria&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 분할된 Logical DNN Accelerators를&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;통한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Multi-tenant &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가속 기법으로 유연한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Task scheduling&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 가능하게 하여 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Throughput, hardware utilization, QOS, Fairness &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;등에 최적화된 새로운 메커니즘을 제안합니다. 이를 통해 하나의 가속기 안에서 Multi DNNs Execution을 가능하게 하며 동시에 여러 DNN Task들을 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;* &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;arms race&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;란 군비 경쟁을 일컫는 말로 위의 상황에서는 단순히 더 많은 돈을 들여 더 크고 다양한 가속기를 맹목적으로 도입하는 상황을 설명합니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcON5Q/btrtjQoz8C8/jMJJaxd0dRkRzD7iIKqm8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcON5Q/btrtjQoz8C8/jMJJaxd0dRkRzD7iIKqm8k/img.png&quot; data-alt=&quot;[Figure 2] Multi-tenant Acceleration : Need for shift focus&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcON5Q/btrtjQoz8C8/jMJJaxd0dRkRzD7iIKqm8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcON5Q%2FbtrtjQoz8C8%2FjMJJaxd0dRkRzD7iIKqm8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;282&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] Multi-tenant Acceleration : Need for shift focus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;1999년도, Powerful한 Accelerator인 GPU가 최초로 세상에 나왔습니다. 그 후, 2001년도에는 GPU를 그래픽 처리 뿐만이 아니라, General Purpose computing을 위해 사용한다는 GPGPU라는 개념이 등장했습니다. &lt;/span&gt;&lt;span&gt;2001년도에서 2009년도로 넘어가며 Hardware resource utilization에 대한 문제가 처음으로 제기되었으며 이를 개선하기 위해 Multi tenancy 개념을 도입하였습니다. 하여, 2009년 최초의 Multi tenancy GPU인 Fermi architecture가 등장했습니다. 2014년에는 Spatial multi-tenancy에 관한 150여개의 연구가 발표되었으며 2014년에는 인공지능 열풍에 힘입어 ML Accelerator 설계에 관현 800여개의 연구들이 발표되었습니다. 하지만 이 기간동안의 연구는 실제 가속기에서의 Resource utilization 문제와 Cost effective adoption이 가장 중요한 조건으로 고려되지 않았습니다. 2020년이 되어서야 이 부분을 고려해 설계해야한다는 주장이 제시되며 위의 문제를 고려한 2가지 정도의 논문이 발표되었습니다. 하지만 2020년에 제시된 Temporal Multi tenant 에 관한 연구는 하드웨어 Utilization 문제를 해결하기 위한 근본적인 해결책이 아닙니다. 왜냐하면 한 시점에서 오직 하나의 Task만이 Dispatch되어 처리될 수 있기 때문입니다. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;하여 본 연구에서 위 문제에 대한 근본적인 해결책을 제시하기 위하여, Dynamic architecture fission을 통한 새로운 Spatial Multi-tenancy DNN 가속기인 'Planaria'를 제안합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Insight&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;i) Concept &amp;amp; Overview&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dykkaK/btrtgqRuHEu/oYHxESDJFSdPGRtO2uRMe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dykkaK/btrtgqRuHEu/oYHxESDJFSdPGRtO2uRMe1/img.png&quot; data-alt=&quot;[Figure 3] Planaria main concept&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dykkaK/btrtgqRuHEu/oYHxESDJFSdPGRtO2uRMe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdykkaK%2FbtrtgqRuHEu%2FoYHxESDJFSdPGRtO2uRMe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;265&quot; data-origin-width=&quot;1397&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] Planaria main concept&amp;amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;Planaria의 기본적인 concept은 하나의 DNN accelerator를 여러 개의 Logical DNN accelerator들로 분할하여 가속한다는 것 입니다. Ready queue에 대기하고 있는 여러 DNN model들은 다시 여러 DNN Task로 분할되어 각 Logical DNN Accelerator에 할당되게 됩니다. 할당된 여러 Task들은 가속기에서 동시에 실행될 수 있으며, 이를 통해 한 번에 하나의 DNN model만 실행될 때 발생하는 Lower utilization 문제를 해결하고 Multi DNN execution이 가능한 환경을 조성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlDYlK/btrtk0EtEOE/mpUqUT9nur7YwwSWgwe7jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlDYlK/btrtk0EtEOE/mpUqUT9nur7YwwSWgwe7jk/img.png&quot; data-alt=&quot;[Figure 4] Dynamic fission into logical accelerators&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlDYlK/btrtk0EtEOE/mpUqUT9nur7YwwSWgwe7jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlDYlK%2Fbtrtk0EtEOE%2FmpUqUT9nur7YwwSWgwe7jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;304&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] Dynamic fission into logical accelerators&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 위의 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;두 그림은 Multi DNN Acceleration을 동시에 실행할 때의 상황을 묘사하고 있습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Planaria&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Key idea&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 바로 동일한 하드웨어에서 다양한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추론들을 분해하고 적합한 장소에 배치하는&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; Dynamic &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;fissioning&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;분해&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기법입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 하나의 가속기 내에서 일어나는 작업입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;일반적으로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가속기는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;on-chip memory bank&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들과 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Computing resource&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MAC unit&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들로 구성되어 있습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 그림에서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;과 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 위의 요소들을 나타내는 그림입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Figure 3의&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(a)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 우선순위가 높은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN task&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 처리하거나 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;QOS &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제약 조건이 큰 경우에 처리되는 상황을 설명합니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;그림의 중간과 오른쪽에 배치되어 있는 Figure 4의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(b)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(c)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;multiple DNN task&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들이 분할되어 재결합한 구조를 설명합니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 그림에서 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Logical accelerator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라는 용어로 표현하고 있으며 이를 통해 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DNN&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들이 높은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Throughput &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 유지하며 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;QOS &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;제약을 충족시킬 수 있습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. (b)는&lt;/span&gt;&lt;span&gt; 두 개의 Logical accelerator들을 사용해 2개의 DNN model들을 동시 가속한 상황을, (c)는 세 개의 Logical accelerator들을 사용해 3개의 DNN model들을 동시에 가속한 상황을 묘사하고 있습니다.&amp;nbsp;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ii) Architecture Design&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFcxOv/btrs8aV6TMr/Pwsaa24ABaNzw0ysZzvr6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFcxOv/btrs8aV6TMr/Pwsaa24ABaNzw0ysZzvr6k/img.png&quot; data-alt=&quot;[Figure 5] Main components for Planaria&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFcxOv/btrs8aV6TMr/Pwsaa24ABaNzw0ysZzvr6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFcxOv%2Fbtrs8aV6TMr%2FPwsaa24ABaNzw0ysZzvr6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1474&quot; height=&quot;682&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 5] Main components for Planaria&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;앞에서 설명한 Dynamic fission을 통한 Multi DNN 가속을 위해서는 2 가지의 Main components들이 필요합니다. 먼저 Dynamic fission을 수행하기 위한 microarchitecture를 설계해야 하며, 두 번째로 Dispatched된 task들을 Hardware resource에 할당하기 위한 Spatial task scheduler가 필요합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxSxhJ/btrtajMnvYV/sqJMwwBThrgOlN7zu58eO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxSxhJ/btrtajMnvYV/sqJMwwBThrgOlN7zu58eO1/img.png&quot; data-alt=&quot;[Figure 6] Objectives and constraints for desining microarchitecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxSxhJ/btrtajMnvYV/sqJMwwBThrgOlN7zu58eO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxSxhJ%2FbtrtajMnvYV%2FsqJMwwBThrgOlN7zu58eO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;243&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 6] Objectives and constraints for desining microarchitecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;Dynamic fission을 위한 microarchitecture 설계의 목표 4가지와 한계 2가지 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZXcim/btrs9J4N6Nm/igCoPfbK9xOYnxGRYtKdo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZXcim/btrs9J4N6Nm/igCoPfbK9xOYnxGRYtKdo0/img.png&quot; data-alt=&quot;[Figure 7] Monolithic systolic array&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZXcim/btrs9J4N6Nm/igCoPfbK9xOYnxGRYtKdo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZXcim%2Fbtrs9J4N6Nm%2FigCoPfbK9xOYnxGRYtKdo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;367&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 7] Monolithic systolic array&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;위의 그림은 일반적인 Systolic array를 설명하는 그림입니다. Systolic array는 여러 PE들이 하나의 집합으로 연결되어 있으며 Input과 Output을 위한 Buffer가 존재합니다. 이 구조에서는 Data가 오직 한 방향으로만 흐를 수 있다는 제한 조건이 있습니다. 예를 들어 Input activation part에서는 데이터들이 왼쪽에서 오른쪽으로만 이동하고, Partial sum을 위해서는 오직 위에서 아래로만 데이터가 이동하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZ4aP/btrtgriDEBD/scpFRK1h1oJKvF0q5Qz3H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZ4aP/btrtgriDEBD/scpFRK1h1oJKvF0q5Qz3H0/img.png&quot; data-alt=&quot;[Figure 8] Need for flexible and cost-effective fission of compute resources&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZ4aP/btrtgriDEBD/scpFRK1h1oJKvF0q5Qz3H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZ4aP%2FbtrtgriDEBD%2FscpFRK1h1oJKvF0q5Qz3H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;360&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 8] Need for flexible and cost-effective fission of compute resources&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;하여 Planaria architecture에서는 데이터의 흐름이 단방향이 아니라 모든 방향으로 이어질 수 있도록 기존의 Systolic array를 분할하고 재결합 하는 방법이 적용되었습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위의 그림들은 다양한 상황에 적합하게 최적화 될 수 있습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예를 들어 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(c)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, 4&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sub systolic array&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들로 분해된 것을 확인할 수 있는데 자주 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Partial sum&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 재활용 하는 경우 가장 효율적으로 이용될 수 있습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(a)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우는 중간 결과의 합 혹은 입력 값이 자주 재사용 되는 경우 효율적으로 이용될 수 있는 시나리오가 됩니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rv30W/btrs9ifTz1u/t66i1YYVE9Giuh4rZBBaoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rv30W/btrs9ifTz1u/t66i1YYVE9Giuh4rZBBaoK/img.png&quot; data-alt=&quot;[Figure 9] Omni directional PE&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rv30W/btrs9ifTz1u/t66i1YYVE9Giuh4rZBBaoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frv30W%2Fbtrs9ifTz1u%2Ft66i1YYVE9Giuh4rZBBaoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;423&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;738&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 9] Omni directional PE&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;이를 통해 전방향으로 데이터가 이동하는 PE를 설계할 수 있었으며 Sub array들의 분할과 재결합을 통해 새로운 Data flow를 만들어낼 수 있었습니다. 하지만 &lt;/span&gt;&lt;span&gt;기존의 Systolic array에서 PE를 전방향으로 바꾸어 새로운 데이터의 흐름을 만들어낸다고 하더라도 Input buffer들과 Output buffer들은 각 Sub array들과 상호 연결되어 있어야 합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgynMP/btrtlTLFkMs/y66k4W2JdemMNUDUykp9A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgynMP/btrtlTLFkMs/y66k4W2JdemMNUDUykp9A0/img.png&quot; data-alt=&quot;[Figure 10] Main problems for connection to sub arrays&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgynMP/btrtlTLFkMs/y66k4W2JdemMNUDUykp9A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgynMP%2FbtrtlTLFkMs%2Fy66k4W2JdemMNUDUykp9A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1710&quot; height=&quot;710&quot; data-origin-width=&quot;1710&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 10] Main problems for connection to sub arrays&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;하지만 기존의 구조를 그대로 사용한다면 좌측에 보이는 것처럼 Input buffer와 Output buffer가 모두 연결되는 Sub array가 딱 한개만 존재할 수 있게 되며, 이를 해결하기 위해 오른쪽 그림처럼 각 Sub array들을 Buffer들과 wire로 모두 연결한다면, 이 상황에서도 매우 큰 자원 낭비가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjN8T1/btrtajySbgD/0ksSaFkivrlVVtTKP793Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjN8T1/btrtajySbgD/0ksSaFkivrlVVtTKP793Sk/img.png&quot; data-alt=&quot;[Figure 11] Overview of Fission pod&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjN8T1/btrtajySbgD/0ksSaFkivrlVVtTKP793Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjN8T1%2FbtrtajySbgD%2F0ksSaFkivrlVVtTKP793Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;457&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;805&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 11] Overview of Fission pod&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;따라서 위에서 제기한 문제를 해결하기 위하여 아예 새로운 아키텍쳐의 도입이 필요합니다. Fission pod이라 불리는 이 구조는 4x4 Read/Write buffer들로 이루어져있으며 각 Sub array들은 Fission pod의 자원을 공유하게 됩니다. &lt;/span&gt;&lt;span&gt;4개의 Sub array들은 Fission pod이라 불리는 on-chip memory pod을 공유하며 &lt;/span&gt;&lt;span&gt;각 Sub array들은 각각의 PE와 SIMD units을 갖고 있어 분할된 logical accelerator로써의 역할을 수행하게 됩니다. &lt;/span&gt;&lt;span&gt;Fission pod은 각 Subarray들의 전방향 Systolic 실행을 가능하게 하며 ifmap과 psum을 공유합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWNwf/btrtb3vNiZO/GMoYYmXC8yELkpLo6lRLW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWNwf/btrtb3vNiZO/GMoYYmXC8yELkpLo6lRLW1/img.png&quot; data-alt=&quot;[Figure 12] Overview of fission pod - MUX/DEMUX&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWNwf/btrtb3vNiZO/GMoYYmXC8yELkpLo6lRLW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWNwf%2Fbtrtb3vNiZO%2FGMoYYmXC8yELkpLo6lRLW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;554&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;706&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 12] Overview of fission pod - MUX/DEMUX&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;전 방향 Systolic array를 위해 Sub array 내부의 각 PE는 위와 같은 Switching network가 필요하게 됩니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmRRTB/btrtgrbPMzF/4lhCdASekduNzHflA8xij0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmRRTB/btrtgrbPMzF/4lhCdASekduNzHflA8xij0/img.png&quot; data-alt=&quot;[Figure 13] Overall architecture of Planaria&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmRRTB/btrtgrbPMzF/4lhCdASekduNzHflA8xij0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmRRTB%2FbtrtgrbPMzF%2F4lhCdASekduNzHflA8xij0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;577&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 13] Overall architecture of Planaria&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;위의 그림은 Planaria micro architecture의 구조를 설명하는 그림입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rB2lf/btrti32uaMd/WxeRkR7ElJr88VPfjlPuJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rB2lf/btrti32uaMd/WxeRkR7ElJr88VPfjlPuJ1/img.png&quot; data-alt=&quot;[Figure 14] Example senario for multi DNN execution&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rB2lf/btrti32uaMd/WxeRkR7ElJr88VPfjlPuJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrB2lf%2Fbtrti32uaMd%2FWxeRkR7ElJr88VPfjlPuJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;547&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 14] Example senario for multi DNN execution&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;위의 Planaria architecture에서는 16개의 Sub array들이 존재할 수 있으며 이를 통해 65가지의 시나리오가 구현될 수 있습니다. 그림에서 볼 수 있는 빨간 박스들은 시나리오 중 하나를 설명하는 그림입니다. 그림과 같이 5개의 DNN Model들이 각 Logical accelerator에 할당되어 동시에 실행될 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lYR3p/btrtiepI2Pp/3V0CcGmvwzaqXlKgHfz3c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lYR3p/btrtiepI2Pp/3V0CcGmvwzaqXlKgHfz3c0/img.png&quot; data-alt=&quot;[Figure 15] Spatial task scheduling requirements&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lYR3p/btrtiepI2Pp/3V0CcGmvwzaqXlKgHfz3c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlYR3p%2FbtrtiepI2Pp%2F3V0CcGmvwzaqXlKgHfz3c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;164&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 15] Spatial task scheduling requirements&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;앞서 설명한 Micro architecture에 여러 DNN Task들을 공간적으로 할당하기 위해서는 새로운 Scheduler의 도입이 필요합니다. 이 Scheduler는 세 가지의 요구 조건들을 충족해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/curqXs/btrtlVbFB3f/YNp422BG3qpa70JwpaMHR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/curqXs/btrtlVbFB3f/YNp422BG3qpa70JwpaMHR0/img.png&quot; data-alt=&quot;[Figure 16] Spatial task scheduler&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/curqXs/btrtlVbFB3f/YNp422BG3qpa70JwpaMHR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcurqXs%2FbtrtlVbFB3f%2FYNp422BG3qpa70JwpaMHR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;304&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 16] Spatial task scheduler&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;먼저 프로그램을 Compile할 때 실행할 Target DNN들을 어떤 시나리오로 가속기에 할당할지 결정해야 합니다. 이를 통해 컴파일러는 실행 파일과 Configuration table들을 생성합니다. 그 다음 실제 실행 시 Spatial Task Scheduler는 위 두 파일을 통해 처리할 Tast들을 실시간으로 Planaria architecture에 할당하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnL0eC/btrtgsV9D6n/rPeLaqMFuDDQxK1CkUeNrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnL0eC/btrtgsV9D6n/rPeLaqMFuDDQxK1CkUeNrk/img.png&quot; data-alt=&quot;[Figure 17]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnL0eC/btrtgsV9D6n/rPeLaqMFuDDQxK1CkUeNrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnL0eC%2FbtrtgsV9D6n%2FrPeLaqMFuDDQxK1CkUeNrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;400&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;715&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 17]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;다음 그림은 처리할 Task들이 도착하거나 끝난 경우에 어떤 순서로 처리되는지를 설명하는 그림입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;iii) Evaluation&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC6A83/btrtlmAznu7/FmM0tXc0CVEiJajxdd98t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC6A83/btrtlmAznu7/FmM0tXc0CVEiJajxdd98t0/img.png&quot; data-alt=&quot;[Figure 18] Evaluation configurations&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC6A83/btrtlmAznu7/FmM0tXc0CVEiJajxdd98t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC6A83%2FbtrtlmAznu7%2FFmM0tXc0CVEiJajxdd98t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;241&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 18] Evaluation configurations&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: &lt;/b&gt;&lt;span&gt;Planaria Architecture와 새로운 Scheduler를 설계하고 검증하기 위해 다음과 같은 환경을 조성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5n94q/btrs7FPGJjI/1kfq0Oay9LlE2DsOcDXJu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5n94q/btrs7FPGJjI/1kfq0Oay9LlE2DsOcDXJu0/img.png&quot; data-alt=&quot;[Figure 19]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5n94q/btrs7FPGJjI/1kfq0Oay9LlE2DsOcDXJu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5n94q%2Fbtrs7FPGJjI%2F1kfq0Oay9LlE2DsOcDXJu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;398&quot; data-origin-width=&quot;1265&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 19]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span&gt;실험에는 세 가지의 INFaaS workload scenario들이 실행되었습니다. Multitenant 환경을 구현하기 위하여 Poisson distribution을 통해 각 요청에 대해 random한 arrival time을 부여하여 datacenter에서 발생할 수 있는 환경과 유사한 환경을 구축하였습니다. 또한 각 DNN benchmark들은 Planaria에서 compile 되었습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Reference&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Kim, Moon Kwon, and Soo Dong Kim. &quot;Inference-as-a-service: A situation inference service for context-aware computing.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;2014 International Conference on Smart Computing&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;. IEEE, 2014.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Auto Driving project/관련 논문</category>
      <category>deep neural networks</category>
      <category>DNN</category>
      <category>DNN acceleration</category>
      <category>Dynamic Architecture Fission</category>
      <category>Multi-Tanancy</category>
      <category>Spatial DNN Task</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/14</guid>
      <comments>https://comsys-pim.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 8 Feb 2022 23:06:34 +0900</pubDate>
    </item>
    <item>
      <title>[IEEE.2021] AI Multi-Tenancy on Edge: Concurrent Deep Learning Model Executions and Dynamic Model Placements on Edge Devices</title>
      <link>https://comsys-pim.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Ref.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;Subedi&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;, P., Hao, J., Kim, I. K., &amp;amp; Ramaswamy, L. (2021, September). AI Multi-Tenancy on Edge: Concurrent Deep Learning Model Executions and Dynamic Model Placements on Edge Devices. In&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;2021 IEEE 14th International Conference on Cloud Computing (CLOUD)&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&amp;nbsp;(pp. 31-42). IEEE.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 논문은 진행중인 Auto Driving 관련 프로젝트의&lt;br /&gt;Insight를 위해 읽었기 때문에&lt;br /&gt;필요한 내용만 간추려 요약하였습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Abstract&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;현재 실제로 사용되는 많은 Application들은 Edge computing paradigm을 따르고 있습니다. Edge computing은 Low latency와 Better privacy protection이라는 큰 장점이 존재합니다. 즉 Application들을 빠르게 처리할 수 있고 보안성 면에서 많은 이점이 있습니다. 최근 Artificial Intelligence(AI) 기술과 Deep Learning(DL) 기술의 발전에 힘입어 Edge devices 에서의 추론 능력은 매우 중요해졌습니다. 하여, 많은 연구들은 Edge device에서 Single DL task를 어떻게 하면 효율적으로 처리할 수 있을지에 대해 논의하였습니다. 하지만 최근 다양한 정보를 유기적으로 처리해야할 필요성이 증가함에 따라 Edge device에서 여러 DL task들을 처리할 수 있는 Multi-tenancy 환경에 대해 논의할 필요가 생겼습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;때문에 위의 논문에서 진행한 연구에서는 두 가지의 Techniques를 제시합니다. (For AI multi-tenancy executions on edge devices)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i) Concurrent model executions (CME)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii) Dynamic model placements (DMP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Introduction&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;현재 많은 AI Application들은 Autonomous Vehicles(AV), Disaster response, Drone-based surveillance 등의 Edge device 기반 Domain에서 널리 사용됩니다. 위의 Edge device 기반 Domain은 두 가지의 큰 특징이 있습니다. 하나는 엄격한 응답 시간 요구 조건을 충족시켜야 한다는 것이고 또 하나는 연산 환경에 많은 Resource 제약이 있다는 점입니다. 위의 두 요건들이 충족되어야 하기 때문에 AI 연산이 Cloud 환경에서 수행되는 것에는 큰 제약 조건들이 존재합니다. Low bandwidth 연결을 통해 많은 양의 데이터들을 Edge device에서 Cloud 환경으로 전송하는 것은 매우 큰 응답시간을 초래하며, Network 연결 불안정 같은 외부 요인에 의해 연산 자체가 방해받을 수 있습니다. 따라서 위와 같은 제한 조건을 충족해야 하는 Domain에서는 Edge device에서 바로 AI 연산을 수행하는 방향으로 연구가 진행되어 왔습니다. 위와 같은 새로운 Paradigm에 힘입어 Raspberry pi, NVIDIA Jetson nano, Google Edge TPU 등 DL tasks들이 edge device 환경에서 바로 연산될 수 있는 새로운 Platform들이 등장하였습니다. 위의 platform들이 등장한 초기의 많은 연구들은 Single DL task를 최적화 시켜 많은 Throughput을 낼 수 있는 방법을 제시하였습니다. 하지만 System이 복잡해지며 많은 데이터를 유기적으로 처리할 필요성이 증가함에 따라, Edge device에서의 Multi-tenancy 연산의 중요성이 대두되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Edge device에서의 효율적인 AI Multi-tenancy execution을 위하여 기본적으로 두 가지 정도의 기술을 사용할 수 있습니다. 첫 번째는 Concurrent model executions(CMEs) 이며 두 번째는 Dynamic model placements(DMPs) 입니다. CME를 통해 다양한 DL models들을 GPU 혹은 Edge TPU중 하나에서 병렬적으로 실행시킬 수 있으며 이를 통해Inference throughput을 향상시킬 수 있습니다. DMP는 여러 DL models들을 다양한 Edge device에서 동시에 실행할 수 있게 하여 Hardware utilization과 Throughput 모두를 향상시키는 방법입니다. DMP는 특히 AI 가속기 환경에서 큰 성능 향상을 이끌어냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edge device에서의 Multi-tenancy는 위와 같은 큰 이점을 갖지만 이들의 한계를 명확하게 인지하는 것 또한 시스템 성능 개선에 중요한 요소입니다. 때문의 이번 연구를 통해 몇 가지의 질문에 대한 답을 찾아보려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i)&amp;nbsp; AI multi-tenancy의 성능적 이점은? (At the device level)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii) edge devices and accelerators의 한계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- limit of model concurrency&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- limit of resource contention&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- limit of resource bottleneck&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 질문들에 대한 답을 찾기 위해선 Edge device, Edge TPU accelerators에서의 Behavior과 Performance를 측정하기 위한 방법에 대해 고찰해야 합니다. 먼저 위의 환경에서 발생 할 수 있는 Critical한 Resource factors를 규정합니다. 그 다음 앞서 설명한 두 가지의 기술이 성능에 어떤 영향을 미치는지 측정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 초기, Edge device에서의 요구 조건을 충족하는 것의 기술적 한계 때문에 많은 AI system들은 Cloud 기반 환경에서 발전해 왔습니다. (ex. Social networks, E-commerce, Finance와 같은 domain들)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Insight&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;i) System specification&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;span style=&quot;color: #203864;&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;devices&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;TPU&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Accelerators&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #203864;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Jetson TX2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #203864;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;* Jetson Nano&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #203864;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;Odroid-N2&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #203864;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;* Raspberry&lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #203864;&quot;&gt;pi 4&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Coral&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Dev&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Board&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Coral&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;USB&lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;Accelerator&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;- DL Frameworks&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Pytorch, MXNet, TensorFlow, TensorFlow Lite&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; : &lt;span style=&quot;color: #000000;&quot;&gt;Pytorch, MXNet, TensorFlow는 CPU와 GPU based DL inference&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #c55a11;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;연산에서 사용되며 &lt;span style=&quot;color: #000000;&quot;&gt;TensorFlow Lite의 경우 Edge TPU 연산을 위해 사용됨&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DL Applications and dataset&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; : Image classification / dataset from ImageNet ILSVRC-2012&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- &lt;span style=&quot;color: #000000;&quot;&gt;Important factors for DL Inferences&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vADV/btrsMA8mE59/xOmfXSkwjw9VDw35LiYkIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vADV/btrsMA8mE59/xOmfXSkwjw9VDw35LiYkIK/img.png&quot; data-alt=&quot;[Figure 1] Correlation equation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vADV/btrsMA8mE59/xOmfXSkwjw9VDw35LiYkIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vADV%2FbtrsMA8mE59%2FxOmfXSkwjw9VDw35LiYkIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;67&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] Correlation equation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; : 위의 Correlation 공식을 통해 DL 성능과 큰 상관관계를 갖는 요소를 파악했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5hEZY/btrsROR3pNx/23OsqK8UkofunxyMFK8iy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5hEZY/btrsROR3pNx/23OsqK8UkofunxyMFK8iy1/img.png&quot; data-alt=&quot;[Figure 2] Correlation factors for inference throughput&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5hEZY/btrsROR3pNx/23OsqK8UkofunxyMFK8iy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5hEZY%2FbtrsROR3pNx%2F23OsqK8UkofunxyMFK8iy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;267&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] Correlation factors for inference throughput&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; : &lt;span style=&quot;color: #000000;&quot;&gt;위의 도표는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CPU, GPU, Edge TPU &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기반 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Inference &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시 각 설정 값 들이 성능과 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 어느 정도의 상관관계를 갖는지 설명하는 그림입니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CPU-based inference(Rpi4, ODN2)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, Batch size&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Memory usage&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 성능과 가장 큰 상관 관계를 보였으며 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GPU-based inference(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;J.nano&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, J,TX2)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 경우&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, Memory usage&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Power consumption&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;성능과 가장 큰 상관 관계를 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 보였습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;마지막으로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Edge TPU&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, Host&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;edge&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;device&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; USB Accelerator &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;사이의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;USB&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Bandwidth&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;성능에 가장 중요한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Factors&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;임을 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 확인 할 수 있었습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고로 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GPU based&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 경우 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DL tasks&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;GPU&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서 수행되며 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CPU&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서는&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; DL &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;연산을 돕는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;co-running &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;applicatio&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들이 실행됩니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ii) DNN models&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP75L8/btrsH9cdGfy/95cn4FZqE6YhqxTAPenfYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP75L8/btrsH9cdGfy/95cn4FZqE6YhqxTAPenfYk/img.png&quot; data-alt=&quot;[Figure 3] DNN models&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP75L8/btrsH9cdGfy/95cn4FZqE6YhqxTAPenfYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP75L8%2FbtrsH9cdGfy%2F95cn4FZqE6YhqxTAPenfYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1786&quot; height=&quot;605&quot; data-origin-width=&quot;1786&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] DNN models&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;color: #000000;&quot;&gt;원래 실행할 모델의 복잡성과 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Neural networks&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Layer&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 수가 증가함에 따라 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DL models&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 연산 정확도와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가 증가하지만 위의 실험에서는 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Edge device &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경에서의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Resource constrained &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 적용하기 위하여 많은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;DL models&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 중 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;9 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;개의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pre trained DL models&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 채택하였습니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;채택한 아홉 개의 모델들은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Edge device&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Image classification &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추론을 시뮬레이션 하기에 적합한 모델 사이즈를 갖고 있음&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;iii) Experimental cofiguration&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf2uIa/btrsOhmIw6A/3JPZJakwo3arEU8IKIDTvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf2uIa/btrsOhmIw6A/3JPZJakwo3arEU8IKIDTvK/img.png&quot; data-alt=&quot;[Figure 4] Measurement steps&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf2uIa/btrsOhmIw6A/3JPZJakwo3arEU8IKIDTvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf2uIa%2FbtrsOhmIw6A%2F3JPZJakwo3arEU8IKIDTvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;221&quot; data-origin-width=&quot;1359&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] Measurement steps&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: &lt;span style=&quot;color: #000000;&quot;&gt;본 연구에서는 위와 같은 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;step&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 갖는 새로운 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Bench marker&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 제시하였고 이를 통해 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Edge device&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서의 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Single tenant case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Multi&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;tenant&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 성능을 비교하였습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;새로운 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Micro architecture&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 제시하여 이를 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;multi tenancy &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경에서 실험한 것이 아니라 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Benchmarker&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의 설정 값을 조정하여 실험 환경을 조성하였습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하지만 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Multi tenant &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;환경에서 적용 가능한 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CME, DMP &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;기술의 이론적 설명과 검증 과정에서 큰 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Insight&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;를 얻을 수 있다 판단하여 자료 조사에 추가하였습니다&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Auto Driving project/관련 논문</category>
      <category>AI Multi-Tenancy</category>
      <category>Concurrent model executions</category>
      <category>Deep Learning at the Edge</category>
      <category>Dynamic model placements</category>
      <category>edge computing</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/13</guid>
      <comments>https://comsys-pim.tistory.com/13#entry13comment</comments>
      <pubDate>Tue, 8 Feb 2022 16:52:08 +0900</pubDate>
    </item>
    <item>
      <title>[PIM] week 01</title>
      <link>https://comsys-pim.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;본 포스팅은 스위스 취리히 연방 공과 대학의 SAFARI Research Group이 주관하는 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;'2021 &lt;/span&gt;Exploring the Processing-in-Memory Paradigm for Future Computing Systems&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;' course를 수강하고 정리한 내용입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;The SAFARI Research Group is led by&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://safari.ethz.ch/safari_public_wp/onur-mutlu/&quot;&gt;Professor Onur Mutlu&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;. &amp;nbsp;We are part of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://ee.ethz.ch/&quot;&gt;Department of Information Technology and Electrical Engineering (D-ITET)&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;at&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://ethz.ch/&quot;&gt;ETH Zurich&lt;/a&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Introduction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;최근 컴퓨팅 시스템에서의 프로세서와 메모리간 데이터 이동은 성능을 결정하는 중요한 지표가 되었습니다. 모바일 장치부터 대규모 서버 환경에 이르기까지 데이터 이동 Cost는 Performance와 Power consumption을 결정하는 주요한 요소가 됩니다. 실행할 데이터를 저장하는 Main memory와 연산을 담당하는 Core 사이의 데이터 이동은 전체 Application system energy의 62% 가량을 차지한다고 알려져 있습니다. 따라서 데이터 이동에서 발생하는 오버헤드는 시스템의 전체 성능을 향상시키기 위해 해결해야할 주요한 요소 중 하나입니다. 이와 같은 문제는 근본적으로 프로세서와 메모리를 분리하여 사용함으로써 발생하는 데이터 이동 병목 현상에서 기인합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;기계 학습, 복잡한 그래프 처리, 데이터 베이스 분석 및 실시간 영상 데이터 분석 등, 현대의 많은 Workload들은 Data 이동시 발생하는 병목 현상으로 성능 향상에 큰 어려움을 겪고 있습니다. 복잡한 Workload들은 불규칙한 메모리 엑세스, 낮은 데이터 재사용율, 낮은 캐시 라인 사용률, Main memory의 용량을 크게 초과하는 Application 실행 등으로 인해 큰 데이터 병목 현상을 겪고 있습니다. 이러한 문제점을 완화하기 위해서는 프로세서와 메모리를 분리해 처리하는 기존의 폰 노이만 구조에서 벗어나, 새로운 컴퓨팅 구조를 도입해야 합니다. 모든 데이터 처리가 프로세서에서만 이루어지는 것이 아니라 데이터가 실제 위치하는 공간과 가까운 장소에서 연산을 수행할 수 있는 데이터 중심 설계로의 패러다임 전환이 필요합니다. 위와 같은 새로운 컴퓨팅 패러다임을 Processin-In-Memory, PIM이라고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하여 2021 Fall SAFARI Seminal를 통해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i) Data movement bottleneck 개념을 이해하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii) Bottleneck에 더 취약한 Key workload characteristics에 대해 이해하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iii) 위의 문제를 해결하기 위한 전통적 방법과 새로운 연구 주제에 대해 공부합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Contents&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Processing in / near memory 개념은 새로운 것이 아니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;오래 전부터 Memory 가까이에 연산 장치를 배치하여 Data 간의 이동시 발생하는 오버헤드를 줄이기 위한 노력이 있었습니다. IEEE학회에 1969년 발표된 'Cellular Logic-in-Memory Arrays'와 1970년 발표된 'A Logic-in-Memory Computer'라는 제목의 논문에서는 현대의 PIM과 유사한 이론을 제시하였으나, 당시에 크게 주목받지 못했습니다. 그 이유는 당시는 아직 반도체 공정 기술과 메모리 기술 등이 지금처럼 발전하지 않았기 때문에 데이터 이동에서 발생하는 병목현상보다 프로세서 자체 혹은 메모리 자체에서 발생하는 오버헤드를 줄이는 것이 성능을 더 크게 향상시킬 수 있는 요인이었기 때문으로 추측할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-작성 진행중-&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://safari.ethz.ch/projects_and_seminars/fall2021/doku.php?id=processing_in_memory&quot;&gt;processing_in_memory [SAFARI Project &amp;amp; Seminars Courses (Fall 2021)] (ethz.ch)&lt;/a&gt;&lt;/p&gt;</description>
      <category>PIM/Study</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/12</guid>
      <comments>https://comsys-pim.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 4 Feb 2022 17:59:49 +0900</pubDate>
    </item>
    <item>
      <title>[AI H/W] What is AI?</title>
      <link>https://comsys-pim.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;br /&gt;[Ref.] https://www.youtube.com/playlist?list=PLm4EZB3VG6zlu1BkFw2DHN58x8QlLHEBu&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 포스팅을 상단 Reference에 첨부한 강의를 수강하고 &lt;br /&gt;정리, 수정, 보완한 자료입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[A] Introduction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qhQ5I/btrr9znnvCc/kBQTQu61LpK12mljWTODZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qhQ5I/btrr9znnvCc/kBQTQu61LpK12mljWTODZ1/img.png&quot; data-alt=&quot;[Figure 1] : Introduction&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qhQ5I/btrr9znnvCc/kBQTQu61LpK12mljWTODZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqhQ5I%2Fbtrr9znnvCc%2FkBQTQu61LpK12mljWTODZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;312&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] : Introduction&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI&amp;nbsp;&amp;gt;&amp;nbsp;ML&amp;nbsp;&amp;gt;&amp;nbsp;Brain-Inspried&amp;nbsp;&amp;gt;&amp;nbsp;Spiking,&amp;nbsp;Neural&amp;nbsp;networks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AI(Artificial Intelligene) in 1956 : 지능형 기계를 만드는 과학과 공학 &lt;br /&gt;- ML(Machine Learning) in 1959 : 컴퓨터가 명시적으로 프로그래밍 하지 않고도 학습 할 수 있는 연구 분야 : 'Training 개념 등장'&lt;br /&gt;- Brain-Inspired : 뇌의 동작 방식에 대한 이해에서 기본 기능을 취하는 알고리즘 &lt;br /&gt;- Spiking : Spike와 같은 Purse 신호에 따라 신호를 주고 받는다.&amp;nbsp; &lt;br /&gt;- Neural networks (Digital 개념) : Weighted sum 개념으로 입력이 일정 임계값을 넘으면 출력이 생성되는 비선형함수 (선형대수) 연산 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[B] How does the brain works?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;neuron-labeled-diagram.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JLU3P/btrsc053Sol/jXLt0k4YRjJqQVMG8KyLx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JLU3P/btrsc053Sol/jXLt0k4YRjJqQVMG8KyLx0/img.png&quot; data-alt=&quot;[Figure 2] Neuron .Ref[1]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JLU3P/btrsc053Sol/jXLt0k4YRjJqQVMG8KyLx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJLU3P%2Fbtrsc053Sol%2FjXLt0k4YRjJqQVMG8KyLx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;350&quot; data-filename=&quot;neuron-labeled-diagram.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] Neuron .Ref[1]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;뇌의 구조에서 영감을 받은 Spiking architecture와 Neural networks 개념을 이해하기 전에 뇌 안에서 신호들이 어떻게 전달되는지 신경 세포의 구조에 대해 공부할 필요성이 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;뇌는&amp;nbsp;약&amp;nbsp;860억개의&amp;nbsp;뉴런으로&amp;nbsp;이루어져있으며&amp;nbsp;각&amp;nbsp;뉴런은&amp;nbsp;시냅스로&amp;nbsp;연결되어&amp;nbsp;있다. &lt;br /&gt;-&amp;nbsp;dendrites&amp;nbsp;:&amp;nbsp;입력&amp;nbsp;신호를&amp;nbsp;받는&amp;nbsp;곳 &lt;br /&gt;-&amp;nbsp;axon&amp;nbsp;:&amp;nbsp;출력&amp;nbsp;신호를&amp;nbsp;내보내는&amp;nbsp;통로 &lt;br /&gt;-&amp;nbsp;synapse&amp;nbsp;:&amp;nbsp;화학적&amp;nbsp;반응에&amp;nbsp;의해서&amp;nbsp;들어오는&amp;nbsp;입력의&amp;nbsp;전달&amp;nbsp;양이&amp;nbsp;결정된다&amp;nbsp;:&amp;nbsp;weight(가중치)&amp;nbsp;라고&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[B-1] Spiking architecture&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Spike_Response_Model_(schematic).jpg&quot; data-origin-width=&quot;2667&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wW5SP/btrr2r5eCr3/i4aCE3qRxGMRnvJVVCMuo0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wW5SP/btrr2r5eCr3/i4aCE3qRxGMRnvJVVCMuo0/img.jpg&quot; data-alt=&quot;[Figure 3] Spike response model .Ref[2]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wW5SP/btrr2r5eCr3/i4aCE3qRxGMRnvJVVCMuo0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwW5SP%2Fbtrr2r5eCr3%2Fi4aCE3qRxGMRnvJVVCMuo0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;316&quot; data-filename=&quot;Spike_Response_Model_(schematic).jpg&quot; data-origin-width=&quot;2667&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] Spike response model .Ref[2]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Spike architecture : 신경망에서 일어나는 메커니즘으로 기억과 학습에 중요한 역할 &lt;br /&gt;(1) 뉴런이 자극을 받으면 spike라는 전기 신호 생성 &lt;br /&gt;(2) spike가 시냅스에 도착하면 신경전달물질이 분비되어 시냅스가 활성화 &lt;br /&gt;(3) 신호를 받는 뉴런의 수용체가 신경전달 물질을 인식해 spike를 발생시킴 &lt;br /&gt;(4) 시냅스를 통해 신호가 전달됨 &lt;br /&gt;(5) 이 때, 뉴런들의 연결을 강화하거나 약화시켜 정보를 장기기억으로 전환하거나 빨리 잊도록 할 수 있음 &lt;br /&gt;(6) 이는 spike가 발생하는 상대적인 간격으로 조절 가능 &lt;br /&gt;(7) presynaptic input이 postsynaptic output 이전에 일어나면 이전 시냅스가 다음 시냅스 신호에 영향을 준 것으로 판단되어 시냅스의 연결이 강화됨 &lt;br /&gt;(8) presynaptic input이 postsynaptic output 이후에 일어나면 뉴런 사이의 상관성이 적다 판단하여 연결이 억제됨 &lt;br /&gt;(9) 이 때 spike의 간격이 좁을수록 입력 spike로 인해 다음 spike가 빨리 나타나게 되고 연결의 변화가 크게 나타남 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[B-2] Neural networks&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b38qtX/btrr2yKtUr1/Dj50xlBTpqhpalCblOicbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b38qtX/btrr2yKtUr1/Dj50xlBTpqhpalCblOicbK/img.png&quot; data-alt=&quot;[Figure 4] Weighted sum .Ref[3]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b38qtX/btrr2yKtUr1/Dj50xlBTpqhpalCblOicbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb38qtX%2Fbtrr2yKtUr1%2FDj50xlBTpqhpalCblOicbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;314&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1297&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] Weighted sum .Ref[3]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Neural&amp;nbsp;Networks &lt;br /&gt;-&amp;nbsp;뇌의&amp;nbsp;구조에서&amp;nbsp;영감을&amp;nbsp;받은&amp;nbsp;이론이며&amp;nbsp;Neuron에&amp;nbsp;Weighted&amp;nbsp;sum의&amp;nbsp;개념을&amp;nbsp;도입하여&amp;nbsp;구조화함 &lt;br /&gt;-&amp;nbsp;입력값(x0)는&amp;nbsp;synapse의&amp;nbsp;weight(w0)와&amp;nbsp;곱해져&amp;nbsp;cell&amp;nbsp;body로&amp;nbsp;도달함 &lt;br /&gt;-&amp;nbsp;각&amp;nbsp;시냅스는&amp;nbsp;같은&amp;nbsp;방법으로&amp;nbsp;cell&amp;nbsp;body로&amp;nbsp;신호&amp;nbsp;전달 &lt;br /&gt;-&amp;nbsp;위의&amp;nbsp;과정들은&amp;nbsp;'곱하고&amp;nbsp;더하는'&amp;nbsp;연산 &lt;br /&gt;-&amp;nbsp;후에&amp;nbsp;cell&amp;nbsp;body에서&amp;nbsp;합쳐진&amp;nbsp;값들이&amp;nbsp;특정&amp;nbsp;임계&amp;nbsp;값(Threshold&amp;nbsp;value)을&amp;nbsp;넘어야&amp;nbsp;신호를&amp;nbsp;전달하는&amp;nbsp;activation&amp;nbsp;function&amp;nbsp;존재함 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;495px-Neural_network_example.svg.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBJKK8/btrr1inCDix/sCMaxj0pUT0EyX3qkNXUm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBJKK8/btrr1inCDix/sCMaxj0pUT0EyX3qkNXUm0/img.png&quot; data-alt=&quot;[Fiigure 5] Simple neural network .Ref[4]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBJKK8/btrr1inCDix/sCMaxj0pUT0EyX3qkNXUm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBJKK8%2Fbtrr1inCDix%2FsCMaxj0pUT0EyX3qkNXUm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;411&quot; data-filename=&quot;495px-Neural_network_example.svg.png&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Fiigure 5] Simple neural network .Ref[4]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hidden layer는 1개 이상이 될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동그라미 하나는 Neuron (node), 동그라미를 연결하는 화살표는 Synaps (edge)라고 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DNN 이란 Neural networks 구조에서 layer가 deep하게 연결되어 있는 구조를 일컫음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[C] Deep Neural Networks (DNN)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5-1.png&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz5Gww/btrr7ri4Xg2/L3YeC74mMwQxRGoUzWlxI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz5Gww/btrr7ri4Xg2/L3YeC74mMwQxRGoUzWlxI0/img.png&quot; data-alt=&quot;[Figure 5] Deep Neural Networks .Ref[5]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz5Gww/btrr7ri4Xg2/L3YeC74mMwQxRGoUzWlxI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz5Gww%2Fbtrr7ri4Xg2%2FL3YeC74mMwQxRGoUzWlxI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;277&quot; data-filename=&quot;5-1.png&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 5] Deep Neural Networks .Ref[5]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Deep Neural Networks&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최근 일반적으로 DNN에 쓰이는 Layer는 5개에서 1000여개 임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Complexity가 높아 더 복잡한 연산을 처리할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Low level features에서 High level features를 추출해내는 과정에서 깊고 복잡한 연산을 수행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 점점 더 복잡한 연산에서 더 높은 정확도를 요구하는 최근에는 더 많은 컴퓨팅 파워가 필요함 : 더 많은 GPU가 사용되어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2015년에 ImageNet이라는 사진 판별 대회에서 ResNet이라는 DNN 알고리즘을 적용한 모델이 사람의 Error rate (5%)보다 낮은 값을 성취함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Deep Learning 의 성공 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) Big Data Availity : 많은 양의 데이터가 필요 , 최근에는 양질의 데이터의 중요성 증가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) GPU Acceleratrion : 반도체 장치 및 아키텍쳐의 발전으로 DNN 처리를 위한 컴퓨팅 파워가 증가함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) New Techniqes : DNN을 쉽게 처리하기 위한 여러 Framework들이 개발됨 (Tensorflow, caffe, pytorch 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*현재 DNN은 High Computing Power를 요구 : AI Hardware를 공부해야 하는 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] &lt;a href=&quot;https://www.explainthatstuff.com/introduction-to-neural-networks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.explainthatstuff.com/introduction-to-neural-networks.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2] https://commons.wikimedia.org/wiki/File:Spike_Response_Model_(schematic).jpg&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[3] https://www.youtube.com/watch?v=FE6snk8Coec&amp;amp;list=PLm4EZB3VG6zlu1BkFw2DHN58x8QlLHEBu&amp;amp;index=4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[4] &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Neural_network_example.svg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://commons.wikimedia.org/wiki/File:Neural_network_example.svg&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[5] &lt;a href=&quot;http://dlwiki.finfra.com/algorithm:dnn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://dlwiki.finfra.com/algorithm:dnn&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lecture Summary/AI HW</category>
      <category>AI</category>
      <category>deep neural networks</category>
      <category>Machine Learning</category>
      <category>Neural Networks</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/11</guid>
      <comments>https://comsys-pim.tistory.com/11#entry11comment</comments>
      <pubDate>Sun, 30 Jan 2022 23:41:21 +0900</pubDate>
    </item>
    <item>
      <title>[CUDA] Multi-Process Service</title>
      <link>https://comsys-pim.tistory.com/10</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;[1] Introduction :&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Multi Process Service (MPS) 개념은 NVIDIA의 Maxwell architecture에서 처음 고안된 방법으로 GPU의 resource utilization 저하 문제를 해결하여 성능 향상(Throughput 증가)을 이끌어내기 위하여 제시되었습니다. GPU가 단순히 그래픽 처리만을 하는 것이 아니라 General purpose computing을 하기 위해 발전해오며 HPC(High Purpose Computing) 응용 프로그램들을 처리하거나 Multi-tenant 환경에서 복잡한 여러 DNN 연산을 수행해야 하는 경우가 생겼습니다. 하여 NVIDIA에서는 한정된 자원을 효과적으로 사용하기 위한 많은 방법을 제시하였으며 ( Stream, Hyper-Q 등 ) 다수의 Process가 하나의 GPU에서 실행될 수 있도록 돕는 런타임 서비스 : MPS 를 도입하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MPS는 여러 CUDA process 들이 단일 GPU *Context를 공유할 수 있도록 하는 기능입니다. MPS에 의해 각 프로세스들은 GPU 분할 사용이 가능하도록 사용 공간을 나누어 할당 받게 됩니다. 이를 통해 GPU의 utilization을 최대화 하는 동시에 각 process 들의 kernel 과 memcopy 연산이 동시에 실행될 수 있도록 합니다. MPS 개념 이전에 등장했던 Stream과 Hyper-Q의 개념을 간단히 정리해보자면, Stream이란 CUDA 실행을 위한 비동기 객체로, 각 Stream 내부의 작업들은 순차적으로 실행되며, 각 Stream 들은 디바이스의 자원이 중첩되지 않는 선에서 동시 실행되게 됩니다. Stream을 통해 여러 작업을 서로 다른 Stream으로 분류해 실행하더라도 실제 GPU의 Scheduling queue (work queue)는 하나였기 때문에 False dependency problem이 발생할 수 있습니다. 하여 이를 해결하기 위해 Hyper-Q라는 Multi work queue 개념이 등장하였습니다. Hyper-Q란 다수의 Hardware work queue를 생성하는 Grid management unit을 도입하여 각 Stream이 같은 pipeline으로 유지되게 함으로써 dependency 문제가 없는 Scheduling을 가능하게 했습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfPHmz/btrruBmONIa/aTwYLWZx7EUnBTnCVsx5LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfPHmz/btrruBmONIa/aTwYLWZx7EUnBTnCVsx5LK/img.png&quot; data-alt=&quot;[Figure 1] Hyper-Q : Multiple Hardware Work Queues&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfPHmz/btrruBmONIa/aTwYLWZx7EUnBTnCVsx5LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfPHmz%2FbtrruBmONIa%2FaTwYLWZx7EUnBTnCVsx5LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;302&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] Hyper-Q : Multiple Hardware Work Queues&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Hyper-Q를 사용함으로써 device 의 resource utilization은 상당히 개선될 수 있었지만 Hyper-Q를 사용하기 위해서는 task들이 반드시 같은 context 상에 속해야 한다는 제한이 있었습니다. 따라서 다른 어플리케이션 실행이 하나의 device에서 이뤄질 수 있도록 MPS(Multi Process Service) 라는 새로운 개념을 도입하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MPS는 서로 다른 커널을 서버에 제출함으로써 서로 다른 Context의 커널들이 단일 Context 내에서 수행되는 것 처럼 보이도록 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmEhWM/btrrxXww8gO/bkwGLnTqLRFvkqj4CDIjCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmEhWM/btrrxXww8gO/bkwGLnTqLRFvkqj4CDIjCk/img.png&quot; data-alt=&quot;[Figure 2] How MPS work?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmEhWM/btrrxXww8gO/bkwGLnTqLRFvkqj4CDIjCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmEhWM%2FbtrrxXww8gO%2FbkwGLnTqLRFvkqj4CDIjCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;406&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] How MPS work?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 MPS의 전체적인 Work load를 설명하는 그림입니다. Control demon process에 의해 MPS Server가 시작되고, Server에 의해 만들어진 실행 환경에 MPS client 가 각 kernel의 context를 순차적으로 제출합니다. 이 실행환경은 Shared context로 실행될 수 있기 때문에 MPS server는 client의 요청을 대표하여 디바이스에 작업들을 동시에 실행시킵니다. 이를 통해 여러 개의 CUDA process들이 하나의 GPU context를 공유하는 것이 가능하게 됩니다. MPS 를 통한 Shared context는 원래 여러 개로 나누어져 있던 디바이스의 데이터 저장 공간 혹은 Scheduling unit 또한 서로 공유 될 수 있다는 것을 의미합니다. 이를 통해 MPS 이전에 GPU가 Process 들을 시분할 방식으로 실행할 때 발생하는 overhead를 획기적으로 줄일 수 있으며 결과적으로 MPS를 통한 resource utilization이 향상되고 실행 시간을 감소시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 여러 MPS의 client가 동시에 실행되는 것과는 달리 MPS의 sever는 오직 한 user만이 실행시킬 수 있습니다. 다시 말해 같은 UID로 서버에 제출된 client만이 GPU에서 동시 실행 될 수 있습니다. 때문에 MPS의 clinet들 중 하나가 비정상적으로 종료된다면, MPS server와 다른 client들이 어떤 상태였는지 알 수 없게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Maxwell architecture에서 처음 제안되었던 MPS는 Volta architecuture가 도입되며 크게 변화했습니다. Volta 이전의 MPS에서는 각 client가 device 주소 공간을 MPS server를 통해 공유하였지만, Volta architecture에서는 Server 대신, 직접 device 에 작업을 제출할 수 있도록 지원하고, 각 cleint를 위한 독립적인 주소 공간을 제공합니다. 또 QoS (Quality of Service)를 위해 실행 자원량을 유기적으로 제한 할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image2.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAGjHI/btrrPomJkWq/zFmuyJqwOSo09ffasF9kjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAGjHI/btrrPomJkWq/zFmuyJqwOSo09ffasF9kjk/img.png&quot; data-alt=&quot;[Figure 3] Volta architecture 이전의 MPS (좌), Volta architecture에 적용된 MPS (우)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAGjHI/btrrPomJkWq/zFmuyJqwOSo09ffasF9kjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAGjHI%2FbtrrPomJkWq%2FzFmuyJqwOSo09ffasF9kjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;334&quot; data-filename=&quot;image2.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] Volta architecture 이전의 MPS (좌), Volta architecture에 적용된 MPS (우)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Maxwell architecture에서 처음 도입된 MPS 는 Architecutre의 발전과 함께 발전해왔습니다. 하여 본 포스팅을 통해 MPS의 발전 과정에 대해 짚어보고, 가장 다이나믹한 변화를 이끈 Volta architectre의 MPS 구조에 대해 집중적으로 논의해보려 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Context : 실행되고 있는 Process 및 Thread의 상태 정보&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[2] When to use MPS :&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MPS 기술은 크게 세 가지의 장점을 사용자에게 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;i) GPU utilization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;ii) Reduced on-GPU cintext storage&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;iii) Reduced GPU context switching&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i) GPU utilization&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU에서 하나의 process 만을 수행된다면 모든 연산을 위한 memory-bandwidth 용량 및 사용 가능한 GPU의 resource들을 최대로 사용할 수 없을 것입니다. 때문에 MPS를 사용하여 여러 process들의 kernel과 memcopy 연산들이 GPU 상에서 overlap되게 하여 GPU의 높은 utilization을 확보하고 더 빠른 running time으로 process 들을 처리 하는 것이 가능해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ii) Reduced on-GPU cintext storage&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MPS를 사용하지 않는다면, 여러 CUDA process들은 구별된 각각의 storage와 scheduling resource들을 할당 받을 것 입니다. 하지만 MPS를 사용하게 된다면 MPS server는 모든 clinets가 하나의 storage와 scheduling resource들을 공유할 수 있습니다. 특히 Volta architecture부터는 MPS clinet들의 독립된 메모리 공간을 사용하도록 지원하여 GPU이 resource 사용을 더 현저하게 줄일 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iii) Reduced GPU context switching&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;MPS를 사용하지 않는다면, Multi processing 수행 시 각 process 들을 위한 scheduling resource들이 모두 지워졌다가 다시 사용되기를 반복해야 합니다. 이는 GPU 실행 성능에 큰 영향을 미치게 됩니다. 하지만 MPS를 사용한다면 MPS server는 모든 clinet들에게 하나의 scheduling resource 세트를 제공하여 여러 clinet가 swiping 될 때 발생하는 overhead를 획기적으로 줄였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하지만 MPS의 client-sever connection에는 정해진 한계가 존재합니다. pre-Volta architecture에서는 각 device 당 16 client CUDA context 까지 지원하며 Volta architecture의 MPS sever의 경우는 48 clinet CUDA context 까지 지원합니다. 만약 connection limit을 넘은 요청을 실행하면 MPS server에 'failed connection' log가 생성될 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[3] MPS Architecture :&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CUDA란 General purpose를 위한 병렬 컴퓨팅 플랫폼입니다. NVIDIA에서는 많은 복잡한 문제들을 CPU보다 GPU에서 훨씬 효율적으로 처리하기위하여 병렬 컴퓨팅 엔진을 위한 Programming model을 제시합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CUDA program은 CUDA context를 생성하는 것으로 시작됩니다. context는 CUDA program이 해당 GPU의 메모리를 관리하고 작업을 시작하는데 필요한 모든 하드웨어 리소스를 캡슐화합니다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU에서 작업이 시작되는 것은 일반적으로 할당된 GPU의 메모리 공간에 필요한 데이터를 복사하는 것과 그 데이터 위에서 CUDA kernel이 실행되는 것, 그리고 나서 GPU 메모리에서 시스템 메모리 공간으로 그 결과를 다시 복사하는 것을 포함합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU에서 CUDA를 통해 실행되는 모든 작업들은 CUDA stream(병렬 실행을 위한 비동기 객체) 이라고 불리는 공간으로 이동하게 됩니다. Stream이란 여러 kernel의 Command들을 순서대로 처리하기 위한 S/W 추상화 개념입니다. 만일 작업이 서로 다른 두 Stream으로 실행된다면 이 둘은 병렬적으로 동시에 처리가 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CUDA stream은 GPU의 driver에 의해 하나 혹은 그 이상의 'work queue'라는 이름으로 불리 수 있습니다. Work queue란 GPU의 특정 engine에 의해 실행될 Stream의 command의 순서를 나타내는 H/W resource 입니다. 하지만 하나의 work queue만을 사용해 생기는 비효율이 확인되었고 Hyper-Q라는 Multi work queue 개념이 등장하게 되었습니다. Hyper-Q란 다수의 Hardware work queue를 생성하는 Grid management unit을 도입하여 각 Stream이 같은 pipeline으로 유지되게 함으로써 dependency 문제가 없는 Scheduling을 가능하게 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU는 time sliced scheduler를 갖고있습니다. 일반적으로 서로 다른 CUDA context가 존재하는 work queue에서 실행된 작업은 동시에 실행 될 수 없습니다. 따라서 이 scheduler를 사용하여 work queue에서 다른 CUDA context들이 실행 될 수 있도록 scheduling 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image3.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3b5F/btrrJGIFDyz/dOqgNRLqkqFWL1K4kgNsj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3b5F/btrrJGIFDyz/dOqgNRLqkqFWL1K4kgNsj1/img.png&quot; data-alt=&quot;[Figure 4] MPS가 적용되지 않은 MPI scheduling 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3b5F/btrrJGIFDyz/dOqgNRLqkqFWL1K4kgNsj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3b5F%2FbtrrJGIFDyz%2FdOqgNRLqkqFWL1K4kgNsj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;382&quot; data-filename=&quot;image3.png&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] MPS가 적용되지 않은 MPI scheduling 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 diagram은 MPS를 사용하지 않고 Multiple OS process가 포함된 MPI application을 수행할 때 CUDA kernel들이 scheduling 되는 방법을 설명하고 있습니다. 각 MPI process 들에 속한 CUDA kernel들은 동시에 예약 될 수 있지만 각 MPI process 들은 time-slice scheduler에 의해 순서대로 실행됩니다. 따라서 MPS가 적용되지 않은 환경에서는 동시에 여러 kernel을 실행하는 것이 불가능 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image4.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWZ8dN/btrrJuu8e1x/ZPA5cYtozlKJGppTgKUoIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWZ8dN/btrrJuu8e1x/ZPA5cYtozlKJGppTgKUoIk/img.png&quot; data-alt=&quot;[Figure 5] Volta architecture 이전의 MPS를 적용한 Client-server architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWZ8dN/btrrJuu8e1x/ZPA5cYtozlKJGppTgKUoIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWZ8dN%2FbtrrJuu8e1x%2FZPA5cYtozlKJGppTgKUoIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;516&quot; data-filename=&quot;image4.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 5] Volta architecture 이전의 MPS를 적용한 Client-server architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Volta architecture 이전의 MPS 를 적용한 Client-sever architecture의 다이어그램은 다음과 같습니다. MPS server를 이용하여 여러개의 context들을 공유하는 하나의 CUDA context는 하드웨어 resource를 관리하게 됩니다. MPS client에 포함된 CUDA context는 MPS server를 통해 작업을 퍼널링 하게 되며 이를 통해 Client의 CUDA context들은 time sliced scheduling과 관련된 H/W 제한을 우회하고 동시에 다른 Kernel들을 실행 시킬 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Volta architectre 에서부터는 새로운 Hardware capabilities를 제안합니다. 이를 통해 MPS server가 관리하던 Hardware 공간을 획기적으로 줄일 수 있었습니다. 한 client CUDA context는 대부분의 하드웨어 resource를 사용할 수 있게 되며, 작업을 하드웨어에 직접 전달해 실행시킬 수 있습니다. Volta MPS sever는 Hardware resource에서 실제로 실행되는 데에 사용되는 공간을 제외한 최소한의 공간만을 사용하게 되며, 개별 client가 제출한 작업을 동시에 예약하고 필요한 나머지 Hardware resource들을 조정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image5.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7hMbV/btrrLNU3A2P/iGaiog4D9TgbQ4MdIWEFVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7hMbV/btrrLNU3A2P/iGaiog4D9TgbQ4MdIWEFVK/img.png&quot; data-alt=&quot;[Figure 6] System-wide provisionging with multiple users (Provisioning Sequence)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7hMbV/btrrLNU3A2P/iGaiog4D9TgbQ4MdIWEFVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7hMbV%2FbtrrLNU3A2P%2FiGaiog4D9TgbQ4MdIWEFVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;568&quot; data-filename=&quot;image5.png&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 6] System-wide provisionging with multiple users (Provisioning Sequence)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[4] Background&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) Process vs Thread&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Process란 실행을 위하여 메모리에 Load된 Program을 의미하며, OS에 의해 자원을 할당받는 작업의 단위 입니다. Thread는 이것보다 더 작은 단위의 작업으로, 할당 받은 자원을 이용하는 실행의 단위를 의미합니다. 따라서 하나의 Process 내에는 1개 이상의 Thread가 발생할 수 있습니다. 즉, Application 하나의 실행이 Process가 되며 Process 내에서 분기 실행 되는 단위가 Thread 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;process.png&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIIAEj/btrrqnIuU0t/uwIjGnCceMyLG28iUHQ0sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIIAEj/btrrqnIuU0t/uwIjGnCceMyLG28iUHQ0sk/img.png&quot; data-alt=&quot;[Figure 7] Process&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIIAEj/btrrqnIuU0t/uwIjGnCceMyLG28iUHQ0sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIIAEj%2FbtrrqnIuU0t%2FuwIjGnCceMyLG28iUHQ0sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;270&quot; data-filename=&quot;process.png&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 7] Process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Process는 위의 그림과 같이 각각의 독립된 메모리 영역을 할당 받습니다. (Code, Data, Stack, Heap 등) 각 Process는 별도의 주소 공간을 할당 받으며 일반적으로 다른 Process의 변수나 자료 구조에 접근할 수 없습니다. 따라서 다른 Process 의 자원에 접근하기 위해서는 Process 간 통신 방법인 IPC (Inter-Process Comunication)을 사용해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Thread란 Process 내에서 실행되는 여러 흐름의 단위로, Process 가 할당받은 자원을 사용하는 실행의 단위입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;thread.png&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dgrjp/btrrsmQSivZ/ktKG1SdQpNxPoBKbtfyq1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dgrjp/btrrsmQSivZ/ktKG1SdQpNxPoBKbtfyq1K/img.png&quot; data-alt=&quot;[Figure 8] Thread&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dgrjp/btrrsmQSivZ/ktKG1SdQpNxPoBKbtfyq1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDgrjp%2FbtrrsmQSivZ%2FktKG1SdQpNxPoBKbtfyq1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;497&quot; height=&quot;264&quot; data-filename=&quot;thread.png&quot; data-origin-width=&quot;2991&quot; data-origin-height=&quot;1588&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 8] Thread&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림처럼 각 Thread는 Process 내에서 Code, Data, Heap 영역을 공유하게 됩니다. (Stack 영역을 Thread 별로 따로 할당 받음) Thread는 Process 와 다르게 한 Process 내의 자원이나 주소 공간을 공유하며 실행되게 됩니다. 각 Thread는 유일하게 따로 할당받은 Stack 영역과 레지스터를 갖고 있지만 나머지 공간들이 서로 공유되어 Process의 더 유연한 실행을 가능하게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) Multi process vs Multi thread&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_F8ckVaR__PlBssnf-mn76A.png&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S44v4/btrrxXQvVUz/eDBsdL4tFXJYO5qPvoJkUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S44v4/btrrxXQvVUz/eDBsdL4tFXJYO5qPvoJkUK/img.png&quot; data-alt=&quot;[Figure 9] Multi process vs Multi thread&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S44v4/btrrxXQvVUz/eDBsdL4tFXJYO5qPvoJkUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS44v4%2FbtrrxXQvVUz%2FeDBsdL4tFXJYO5qPvoJkUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;763&quot; height=&quot;388&quot; data-filename=&quot;1_F8ckVaR__PlBssnf-mn76A.png&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 9] Multi process vs Multi thread&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Multi-processing란 하나의 응용 프로그램을 수행하기 위하여 프로그램을 여러 개의 Process로 나누어 실행하는 방법으로, 각 프로세스가 하나의 작업(Task)를 수행하게 됩니다. Multi process 환경에서는 최초의 단일 프로세스를 부모 Process라 하며 부모 Process에서 파생된 다양한 자식 Process가 존재하게 됩니다. 때문에 여러 자식 Process 중 하나가 문제가 발생하더라도 다른 Task에 영향을 끼치지 않는다는 장점이 존재합니다. Multi process를 H/W적인 관점에서 바라보게 되면 Context switching 개념을 이해해야 합니다. Context switching이란 Processor(CPU)에서 여러 Process들을 번갈아 가며 실행하는 행위를 의미합니다. 즉 지금 실행되는 Process의 상태 (Context)를 잠시 저장하고 대기하던 다른 Process를 실행하게 되며 이 과정에서 이전에 보관하였던 이전 Process의 상태 (Context)가 다시 복구됩니다. Multi process를 실행하게 된다면 Context switching 과정에서 overhead가 발생할 우려가 존재합니다. 각 Process들은 각각의 독립 메모리 공간을 할당받기 때문에 Context switching 수행 시 Cache에 있는 모든 Data를 삭제하고 새롭게 불러와야 합니다. 이는 각 Process 사이에 자원과 변수들을 공유하지 않는다는 특징에 기인합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Multi-threading이란 하나의 응용 프로그램을 수행하기 위하여 여러 Thread로 나누어 실행하는 방법으로, 각 Thread는 하나의 작업을 맡아 처리하게 됩니다. 즉 하나의 작업을 처리하기 위하여 여러 프로그램을 켜서 처리하는 것이 아니라 한 프로그램 내에서 그 작업들을 세분화해 처리한다는 개념입니다.&amp;nbsp;Window와 Linux등 많은 OS에서 Multi thread를 지원하며 Web-server 환경은 대표적인 Multi thread 환경입니다. Multi thread의 경우 프로세스를 할당해 자원을 공유하는 System call이 줄어들고 Thread 간의 data 공간을 공유하기 때문에 자원 활용에 있어 많은 이점이 있습니다. 하지만 자원을 공유하는 특성 때문에 하나의 Thread에 문제가 생기면 전체 Process에 영향을 끼칠 수 있으며 Thread간의 자원 공유시 전역 변수를 사용하기 때문에 함께 사용시 충돌이 발생할 수 있다는 단점이 있습니다. 하지만 일반적으로 Process 간 통신 (IPC)의 처리 비용보다 Thread 간의 통신에 대한 처리 비용이 훨씬 적게 든다는 장점이 존재합니다. (Multi thread 환경에서는 Context switchig시 Stack 영역만 처리하면 됨)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) GPU Context switching&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Context switching의 개념은 한정적인 자원인 Processor에서 여러 Process 및 Thread들을 효과적으로 처리하기 위한 방법으로 현재 진행하고 있는 Task(Process or Thread)의 상태를 저장하고 다음에 진행할 Task의 상태를 읽어들여 실행하는 방법입니다. Processor는 Context Switching 처리를 통해 현재 Task가 수행되는 동안 다음 Task를 대기시키는 것이 아니라 사용자에게 여러 Task가 동시에 처리되도록 보여지게 합니다. 하지만 Context switching에는 cost가 존재합니다. (일반적으로 Process의 Context switching이 Thread의 Context switching보다 큰 cost가 듭니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU의 Context switching은 CPU에서 실행되는 것과 상황이 조금 다릅니다. CPU에서의 Context switching은 상당히 큰 cost가 드는 반면에, GPU에서는 비교적 자유로운 환경에서 실행되게 됩니다. 기본적으로 Processor 내부에서 Context switching이 발생할 때 Register 값을 새롭게 저장하거나 변경해야 합니다. GPU에서는 CPU보다 훨씬 많은 Register가 존재하기 때문에 Context switching에 대한 Overhead가 거의 발생하지 않습니다. 또한 GPU에서는 Warp 단위로 Context switching이 발생하는데 최대한 많은 Warp를 할당하여 Task 수행에 드는 Latency를 hiding하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(4) MPI : Message Passing Interface&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mpi.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lG90d/btrrqZNRH9z/hfuVTNwRwsea97hiT7rC70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lG90d/btrrqZNRH9z/hfuVTNwRwsea97hiT7rC70/img.png&quot; data-alt=&quot;[Figure 10] Message Passing Interface&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lG90d/btrrqZNRH9z/hfuVTNwRwsea97hiT7rC70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlG90d%2FbtrrqZNRH9z%2FhfuVTNwRwsea97hiT7rC70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;361&quot; data-filename=&quot;mpi.png&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 10] Message Passing Interface&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Message Passing Interface란 병렬 처리에 사용되는 표준 라이브러리를 의미합니다. Message passing이란 지역적으로 구별된 메모리 공간을 갖는 process 들이 data들을 공유하기 위하여 메세지(공유할 data 들)를 송수신 하는 방법을 의미하며 Parallelism을 위한 여러 부분을 programmer가 직접 수행하게 되며 복잡하지만 유연한 적용이 가능하다는 장점이 있습니다.&amp;nbsp;즉 위의 그림처럼 하나의 프로세스를 n개의 프로세스로 쪼개어 병렬 처리한 후에 그 출력 값을 다시 모아 최종적인 결과 값으로 도출해내는 일련의 과정이 Message passing 기술로 수행되며, Message passing을 위한 라이브러리 중 하나가 바로 MPI 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MPI : 메세지 패싱 병렬 프로그래밍을 위해 표준화된 데이터 통신 라이브러리&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[5] Reference :&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) &lt;a href=&quot;https://on-demand.gputechconf.com/gtc/2015/presentation/S5584-Priyanka-Sah.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://on-demand.gputechconf.com/gtc/2015/presentation/S5584-Priyanka-Sah.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) &lt;a href=&quot;https://docs.nvidia.com/deploy/mps/index.html#topic_6&quot;&gt;Multi-Process Service :: GPU Deployment and Management Documentation (nvidia.com)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) &lt;a href=&quot;https://levelup.gitconnected.com/diy-multithreading-vs-multiprocessing-in-python-fb93698ca7f3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://levelup.gitconnected.com/diy-multithreading-vs-multiprocessing-in-python-fb93698ca7f3&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(4) &lt;a href=&quot;https://hayunjong83.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hayunjong83.tistory.com/17&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5) &lt;a href=&quot;http://ap2.khu.ac.kr/download/mpi_lec.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://ap2.khu.ac.kr/download/mpi_lec.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Lecture Summary/CUDA</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/10</guid>
      <comments>https://comsys-pim.tistory.com/10#entry10comment</comments>
      <pubDate>Wed, 26 Jan 2022 18:32:35 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] time 명령어</title>
      <link>https://comsys-pim.tistory.com/9</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;penguin-42936_1280.png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;1280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRmVD/btrrfmvOvxX/kAFUXS2y5XWesRfJ1zl7GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRmVD/btrrfmvOvxX/kAFUXS2y5XWesRfJ1zl7GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRmVD/btrrfmvOvxX/kAFUXS2y5XWesRfJ1zl7GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRmVD%2FbtrrfmvOvxX%2FkAFUXS2y5XWesRfJ1zl7GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;411&quot; data-filename=&quot;penguin-42936_1280.png&quot; data-origin-width=&quot;1075&quot; data-origin-height=&quot;1280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서는 특정 프로그램의 실행시간 측정을 위하여 time 명령어를 자주 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IX1hn/btrrbTPnf9i/F6HztMTampxkL1UbbxIo4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IX1hn/btrrbTPnf9i/F6HztMTampxkL1UbbxIo4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IX1hn/btrrbTPnf9i/F6HztMTampxkL1UbbxIo4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIX1hn%2FbtrrbTPnf9i%2FF6HztMTampxkL1UbbxIo4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;36&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;36&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 입력 시 'real', 'user', 'sys'로 통칭되는 3가지의 정보가 출력되는데 각 time이 의미하는 바는 서로 상이합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 프로그램의 time 측정 시 각 시간이 의미하는 바를 명확하게 이해하고 사용해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Real&lt;/b&gt; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Actual elapsed time(실제 경과 시간)으로 wall clock time으로 불립니다. 이는 순수하게 측정된 전체 실행시간을 의미하므로 환경과 상황에 따른 변수가 작용할 수 있어 이론적 예측이 어렵습니다. 이는 call 을 실행한 순간부터 마치는 순간 까지를 의미하며 여러 프로세스들이 실행되는 시간과 프로세스들이 블락되는 시간을 포함합니다. ( I/O을 위해 대기하는 시간 등 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;User&lt;/b&gt; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로세스 내부의 user-mode code가 실행되는데에 걸린 CPU time입니다. 이는 Kernel 밖에서 실행되는 시간이며 실제 프로세스가 실행되는데 걸린 CPU time을 의미합니다. ( 연산이 진행되는 동안 CPU가 소비한 누적 시간의 합 ) user time에는 프로세스가 블락되어 대기하는 시간은 포함되지 않습니다. 따라서 테스크가 실제로 연산되는 시간 외의 대기 시간은 User 시간에 포함되지 않습니다. 정리해보자면 user time은 명령어를 실제로 실행하여 연산한 시간의 총 합입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sys&lt;/b&gt; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로세스 내부의 커널에서 실행된 CPU time의 결과입니다. 이 시간은 user-mode에서 실행되는 라이브러리 코드와는 달리 Kernel 내부에서 system call에 사용된 CPU time만을 의미합니다. 예를 들어 메모리 할당과 같은 시스템 관련 작업 동안 CPU가 소비한 누적 시간 입니다. sys time의 경우 단일 프로세스라면 real time과 동일하겠지만, 멀티 프로세스로 작업이 처리되는 경우 프로세스들이 데이터 엑세스를 위해 경쟁하기 때문에 단일 프로세스의 경우보다 더 늘어나게 됩니다. 정리하자면, Sys time은 실행 중인 명령어를 지원하기 위해 시스템 차원에서 이루어지는 메모리 할당 및 파일 I/O등의 작업을 처리하기 위해 Kernel 단에서 실행되는 시간의 총 합입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* User + Sys time&lt;/b&gt; : 프로세스가 사용한 실제 CPU time 입니다. 여러 프로세서가 병렬로 동작할 수 있기 때문에 때때로 real time보다 user + sys time이 더 클 수도 있습니다. 즉 프로세스 안에 여러 thread가 존재하고 이 프로세스가 둘 이상의 연산 프로세서에서 처리된다면 real time보다 더 큰 값으로 측정될 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* A brief primer on Kernel vs. User mode&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;On Unix, or any protected-memory operating system,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Kernel_mode#Supervisor_mode&quot;&gt;'Kernel' or 'Supervisor'&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;mode refers to a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Process_management_(computing)#Processor_modes&quot;&gt;privileged mode&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;that the CPU can operate in. Certain privileged actions that could affect security or stability can only be done when the CPU is operating in this mode; these actions are not available to application code. An example of such an action might be manipulation of the&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Memory_management_unit&quot;&gt;MMU&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to gain access to the address space of another process. Normally,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/User_space&quot;&gt;user-mode&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;code cannot do this (with good reason), although it can request&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Shared_memory&quot;&gt;shared memory&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;from the kernel, which&lt;span&gt;&amp;nbsp;&lt;/span&gt;could&lt;span&gt;&amp;nbsp;&lt;/span&gt;be read or written by more than one process. In this case, the shared memory is explicitly requested from the kernel through a secure mechanism and both processes have to explicitly attach to it in order to use it.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The privileged mode is usually referred to as 'kernel' mode because the kernel is executed by the CPU running in this mode. In order to switch to kernel mode you have to issue a specific instruction (often called a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Trap_(computing)&quot;&gt;trap&lt;/a&gt;) that switches the CPU to running in kernel mode&lt;span&gt;&amp;nbsp;&lt;/span&gt;and runs code from a specific location held in a jump table.&lt;span&gt;&amp;nbsp;&lt;/span&gt;For security reasons, you cannot switch to kernel mode and execute arbitrary code - the traps are managed through a table of addresses that cannot be written to unless the CPU is running in supervisor mode. You trap with an explicit trap number and the address is looked up in the jump table; the kernel has a finite number of controlled entry points.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The 'system' calls in the C library (particularly those described in Section 2 of the man pages) have a user-mode component, which is what you actually call from your C program. Behind the scenes, they may issue one or more system calls to the kernel to do specific services such as I/O, but they still also have code running in user-mode. It is also quite possible to directly issue a trap to kernel mode from any user space code if desired, although you may need to write a snippet of assembly language to set up the registers correctly for the call.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* More about 'sys'&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There are things that your code cannot do from user mode - things like allocating memory or accessing hardware (HDD, network, etc.). These are under the supervision of the kernel, and it alone can do them. Some operations like&lt;span&gt;&amp;nbsp;&lt;/span&gt;malloc&lt;span&gt;&amp;nbsp;&lt;/span&gt;orfread/fwrite&lt;span&gt;&amp;nbsp;&lt;/span&gt;will invoke these kernel functions and that then will count as 'sys' time. Unfortunately it's not as simple as &quot;every call to malloc will be counted in 'sys' time&quot;. The call to&lt;span&gt;&amp;nbsp;&lt;/span&gt;malloc&lt;span&gt;&amp;nbsp;&lt;/span&gt;will do some processing of its own (still counted in 'user' time) and then somewhere along the way it may call the function in kernel (counted in 'sys' time). After returning from the kernel call, there will be some more time in 'user' and then&lt;span&gt;&amp;nbsp;&lt;/span&gt;malloc&lt;span&gt;&amp;nbsp;&lt;/span&gt;will return to your code. As for when the switch happens, and how much of it is spent in kernel mode... you cannot say. It depends on the implementation of the library. Also, other seemingly innocent functions might also use&lt;span&gt;&amp;nbsp;&lt;/span&gt;malloc&lt;span&gt;&amp;nbsp;&lt;/span&gt;and the like in the background, which will again have some time in 'sys' then.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reference &lt;/b&gt;: &lt;b&gt;&lt;a href=&quot;https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/556405/what-do-real-user-and-sys-mean-in-the-output-of-time1&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>Linux</category>
      <category>time 명령어</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/9</guid>
      <comments>https://comsys-pim.tistory.com/9#entry9comment</comments>
      <pubDate>Thu, 20 Jan 2022 17:35:03 +0900</pubDate>
    </item>
    <item>
      <title>[IEEE.2014] LEoNIDS: A low-latency and energy-efficient network-level intrusion detection system.</title>
      <link>https://comsys-pim.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Reference&lt;/b&gt; :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&amp;nbsp;Tsikoudis, Nikos, Antonis Papadogiannakis, and Evangelos P. Markatos. &quot;LEoNIDS: A low-latency and energy-efficient network-level intrusion detection system.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;IEEE Transactions on Emerging Topics in Computing&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;4.1 (2014): 142-155.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;본 논문은 현재 진행중인 Auto Driving 프로젝트 관련 &lt;br /&gt;유관 연구 조사로 읽었기 때문에&lt;br /&gt;필요한 부분만 발췌하여 요약하였습니다.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Abstract&lt;/b&gt; :&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;데이터&amp;nbsp;센터와&amp;nbsp;모바일&amp;nbsp;디바이스들이&amp;nbsp;발전해온&amp;nbsp;지난&amp;nbsp;10년&amp;nbsp;동안&amp;nbsp;low-power&amp;nbsp;system을&amp;nbsp;구축하는&amp;nbsp;것에&amp;nbsp;매우&amp;nbsp;많은&amp;nbsp;노력이&amp;nbsp;기울여젔습니다.&amp;nbsp;하지만&amp;nbsp;그것에&amp;nbsp;비해&amp;nbsp;security&amp;nbsp;system을&amp;nbsp;구축하는&amp;nbsp;것에는&amp;nbsp;아직&amp;nbsp;많은&amp;nbsp;노력이&amp;nbsp;필요합니다.&amp;nbsp;하여&amp;nbsp;이번&amp;nbsp;연구에서는,&amp;nbsp;현대&amp;nbsp;컴퓨터&amp;nbsp;네트워크의&amp;nbsp;secure&amp;nbsp;operation을&amp;nbsp;향상시킬&amp;nbsp;수&amp;nbsp;있으며&amp;nbsp;적은&amp;nbsp;power&amp;nbsp;consumption&amp;nbsp;을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;새로운&amp;nbsp;*network-level&amp;nbsp;instruction&amp;nbsp;detection&amp;nbsp;system&amp;nbsp;(NIDS)를&amp;nbsp;제안합니다.&amp;nbsp;과거&amp;nbsp;전통적인&amp;nbsp;low-power&amp;nbsp;consumption&amp;nbsp;system은&amp;nbsp;(frequency&amp;nbsp;scaling&amp;nbsp;같은&amp;nbsp;방법)&amp;nbsp;packet&amp;nbsp;processing&amp;nbsp;과&amp;nbsp;queuing&amp;nbsp;times의&amp;nbsp;불균형을&amp;nbsp;야기시켰습니다.&amp;nbsp;따라서&amp;nbsp;이번&amp;nbsp;paper를&amp;nbsp;통해&amp;nbsp;이런&amp;nbsp;방법이&amp;nbsp;detection&amp;nbsp;latency와&amp;nbsp;timely&amp;nbsp;reaction을&amp;nbsp;향상시킴을&amp;nbsp;보이고&amp;nbsp;이를&amp;nbsp;해결할&amp;nbsp;새로운&amp;nbsp;아키텍쳐인&amp;nbsp;low-latency&amp;nbsp;and&amp;nbsp;energy&amp;nbsp;efficient&amp;nbsp;NIDS&amp;nbsp;(LEoNIDS)를&amp;nbsp;제안합니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* NIDS 관련 paper : Heady, Richard, et al. The architecture of a network level intrusion detection system. No. LA-SUB-93219. Los Alamos National Lab., NM (United States); New Mexico Univ., Albuquerque, NM (United States). Dept. of Computer Science, 1990.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt; :&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;NIDS는 일반적으로 멀티 코어 시스템 혹은 서버 클러스터에서 널리 사용됩니다. 하지만 NIDS 같은 security system의 에너지 효율에 관련해서는 많은 연구 개발이 이루어지지 않았습니다. 하여 이번 연구를 통해 현재 가장 흔히 사용되는 cyber security 기법인 NIDS의 에너지 효율을 향상시킬 수 있는 새로운 아키텍쳐를 제안합니다. : LEoNIDS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선, low traffic 환경에서 적은 에너지를 쓰기 위하여 Dynamic Voltage and Frequecy scaling (DVFS) 방법과 sleep states (C-states)를 제안합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;본 연구 내용 중, AD 프로젝트에 도움이 되는 개념 및 실험 결과 :&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) 연산을 위해 더 많은 Core를 사용하고 더 느린 frequency를 사용하게 되면 Energy consumption 측면에서는 이득이지만 더 높은 detection latency를 야기시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp5lzz/btrrfnH8br9/hQEBQZVW8J6B7nLUx6JKak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp5lzz/btrrfnH8br9/hQEBQZVW8J6B7nLUx6JKak/img.png&quot; data-alt=&quot;[Figure 01] Trade off of number of cores and lower frequency&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp5lzz/btrrfnH8br9/hQEBQZVW8J6B7nLUx6JKak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp5lzz%2FbtrrfnH8br9%2FhQEBQZVW8J6B7nLUx6JKak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;202&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 01] Trade off of number of cores and lower frequency&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2) Detection latency에서 queuing delay는 매우 critical한 요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ooUe8/btrrdYItzR6/pwkOLIVHZiaTpWmzGPE6Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ooUe8/btrrdYItzR6/pwkOLIVHZiaTpWmzGPE6Sk/img.png&quot; data-alt=&quot;[Figure 02] The main cause of increased detection time is queuing delay&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ooUe8/btrrdYItzR6/pwkOLIVHZiaTpWmzGPE6Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FooUe8%2FbtrrdYItzR6%2FpwkOLIVHZiaTpWmzGPE6Sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;343&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 02] The main cause of increased detection time is queuing delay&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Packet latency는 세 가지 파트로 나뉠 수 있습니다. (i) &lt;u&gt;interrupt handling time&lt;/u&gt; : OS kernel에서 packet을 핸들링하는 시간, (ii) &lt;u&gt;queuing delay&lt;/u&gt; : packet이 queue에서 전송되기 위해 대기하는 시간, (iii) &lt;u&gt;processing time&lt;/u&gt; : user level에서 NIDS가 실행되는 시간, 이 세가지 요소 중 interrupt handling time은 다른 요소에 비해 매우 작기 때문에 무시할 수 있는 요소이며 실제 연산 처리 시간인 processing time을 제외하고 연산 성능에 가장 큰 영향을 미치는 요소는 바로 Queuing delay임을 실험을 통해 확인할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3) Queuing delay를 구하는 공식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;c : Tne number of active cores&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124;&quot;&gt;&amp;lambda;&lt;/span&gt;c : The rate of packets arrived at each core&amp;nbsp; ( = &lt;span style=&quot;background-color: #ffffff; color: #202124;&quot;&gt;&amp;lambda; / &lt;/span&gt;c )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;mu;&lt;span&gt;c : The rate of queued packets served from each core ( = &amp;mu; / cmax )&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;pc : The core's utilization ( = &lt;span style=&quot;background-color: #ffffff; color: #202124;&quot;&gt;&amp;lambda;&lt;/span&gt;c / &amp;mu;c &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brXN4x/btrrbSpjzH7/524KxE8uxW8TP0skCgbx91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brXN4x/btrrbSpjzH7/524KxE8uxW8TP0skCgbx91/img.png&quot; data-alt=&quot;[Figure 03] The average queuing delay&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brXN4x/btrrbSpjzH7/524KxE8uxW8TP0skCgbx91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrXN4x%2FbtrrbSpjzH7%2F524KxE8uxW8TP0skCgbx91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;118&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 03] The average queuing delay&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;&lt;span&gt;4) 본 연구에서 제시하는 LEoNIDS 아키텍쳐&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vZwYb/btrrciuzd5d/iX0RdEQOsLLQz8YtGlMNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vZwYb/btrrciuzd5d/iX0RdEQOsLLQz8YtGlMNI1/img.png&quot; data-alt=&quot;[Figure 04] LEoNIDS Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vZwYb/btrrciuzd5d/iX0RdEQOsLLQz8YtGlMNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvZwYb%2Fbtrrciuzd5d%2FiX0RdEQOsLLQz8YtGlMNI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;979&quot; height=&quot;541&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 04] LEoNIDS Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Auto Driving project/관련 논문</category>
      <category>LEoNIDS</category>
      <category>nids</category>
      <category>Power efficiency</category>
      <category>queuing delay</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/8</guid>
      <comments>https://comsys-pim.tistory.com/8#entry8comment</comments>
      <pubDate>Thu, 20 Jan 2022 12:41:45 +0900</pubDate>
    </item>
    <item>
      <title>[IEEE.2018] Processing-in-memory for energy-efficient neural network training: A heterogeneous approach.</title>
      <link>https://comsys-pim.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Liu, Jiawen, et al. &quot;Processing-in-memory for energy-efficient neural network training: A heterogeneous approach.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;2018 51st Annual IEEE/ACM International Symposium on Microarchitecture (MICRO)&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;. IEEE, 2018.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Abstract :&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Nerural Networks(NNs)는 Image classification, speech recognition, object detection, computer vision 등 다양한 분야의 application에 활용되고 있습니다. 하지만 현재 Neural Networks 를 Training하는 데에는 시간적, 에너지적 비효율성이 존재합니다. (특히 DNNs 분야) 왜냐하면 많은 데이터들이 메모리와 프로세서 사이를 이동하기 때문입니다. (예전에는 Processor의 성능 자체, Memory의 성능 자체가 프로그램 실행 속도에 큰 영향을 미쳤지만, 현재 엄청난 성장을 이룬 Processor와 Memory Architecture로 그 자체의 성능이 아니라 그 둘 사이를 이동하는 Data의 병목현상이 프로그램 실행 성능에 Critical한 요소가 되었습니다.) 또한 DNNs의 Training에는 아주 복잡한 Fine-grained operation이 처리되어야 하기 때문에 현재의 방법으로 이를 빠르게 병렬 처리하는 데에 어려움이 존재합니다. 하여, 이 논문을 통해 Software/Hardware co-design인 Heterogeneous processing-in-memory(PIM)를 제시합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;PIM의 H/W 모델에는 기본적으로 Heterogeneous PIM Architecture 구현을 위한 Logic layer가 존재합니다. 이 Logic layer는 3D die-stacked momory 구조로 설계되었으며 그 위에 수백개의 Fix-function을 위한 arithmetic units과 프로그래밍이 가능한 ARM based cores가 존재합니다. 3D die-stacked memory 구조란 평평한 Silicon 위에 연산을 위한 Logic layer을 쌓고 그 위에 DRAM을 순차적으로 올려 쌓는 구조를 의미합니다. (앞서 설명했듯이 Logic layer에는 Fixed-function cores와 Programmable cores가 존재합니다.) 또한 같은 Silicon 위에 CPU가 존재하기 때문에 Heterogeneous PIM Architecture라고 이름을 명명하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hea3Q/btrqIr5wx5P/FKDBFKIo5lWRdXyyULCkS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hea3Q/btrqIr5wx5P/FKDBFKIo5lWRdXyyULCkS1/img.png&quot; data-alt=&quot;[Figure 1] PIM Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hea3Q/btrqIr5wx5P/FKDBFKIo5lWRdXyyULCkS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHea3Q%2FbtrqIr5wx5P%2FFKDBFKIo5lWRdXyyULCkS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;398&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] PIM Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;PIM의 S/W design은 프로그래밍 모델과 함께 다양한 Neural Networks를 training하기 위한 runtime system을 제공합니다. 이는 CPU와 Heterogeneous PIM compute resources를 사용하는 것을 용이하게 합니다. 또한 OpenCL 프로그래밍의 확장을 통해 간단하게 프로그래밍 할 수 있는 환경을 제공하며 높은 프로그램 이식성을 갖추고 있습니다. 또한 Heterogeneous H/W를 관리하고 최적화 하는 데에 도움이 되며 이를 통해 시스템 에너지 효율성 증대 및 H/W Utilization 증가를 도모할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*OpenCL : Heterogeneous(이기종) 플랫폼에서 실행되는 프로그램을 작성하기 위한 개방형 범용 병렬 컴퓨팅 Framework, 이를 통해 task-based 병렬 컴퓨팅 혹은 data-based 병렬 컴퓨팅을 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Introduction :&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;오늘날, Neural networks 연산에는 매우 많은 parameters와 data sets가 이용됩니다. 예를 들어 VGG와 AlexNet의 경우 각각 138M과 61M의 parameters를 image classification을 위해 사용합니다. 이와 같은 복잡한 model을 Training하는 경우에 엄청난 Computing resource와 Memory resource를 필요로 합니다. (많은 에너지와 시간 또한 필요합니다.) 많은 Resource를 사용하는 경우에 가장 성능에 가장 Critical한 요소 중 하나는 바로 NNs를 Training하는 경우 발생하는 Bottleneck 현상입니다. (System 안에서 많은 양의 Data 가 이동하며 발생하는 병목 현상) 현재의 NN model은 더욱 커지고 복잡해지고 있습니다. 때문에 성능을 개선하기 위한 아래 설명한 연구처럼 다양한 방면의 노력들이 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1] Low-precision data를 사용해 연산 성능을 개선하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2] Prune NN models를 사용해 연산 성능을 개선하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;하지만 위의 연구들은 NN model의 간략화에 대한 영향을 정량화 하는 데에 어려움이 존재하며, 근본적으로 NN model을 Training 할 때 발생하는 Data의 이동을 다루지 않습니다. (데이터의 이동에 의해 발생하는 병목현상을 해결하기 위한 근본적인 해결책이라 볼 수 없음.) 따라서 이번 연구를 통해 이를 해결하기 위한 조금 더 근본적인 해결책인 Heterogeneous PIM Architecture를 제시하려합니다. 최근의 PIM 관련 연구는 다양한 app 실행시 발생하는 데이터 이동 병목 현상을 해결하기 위한 유망한 솔루션을 제시하고 있습니다. 하지만 PIM Architecture 관련 연구의 경우 Programming 방법과 System runtime과 관련하여 몇 가지 어려움이 존재하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;첫 번째로 NNs Training을 가속하기 위해 PIM을 programming 하는 것은 매우 어렵습니다. 오늘날의 Tensorflow같은 Machine Learning framework들은 다양한 하드웨어에서 NN 작업을 구현하기에 용이합니다. 하지만 PIM software interface의 경우 PIM Architecture에 대한 심도 있는 하드웨어적 이해를 필요로 합니다. 때문에 PIM의 programming method를 개선하여 프로그래머들의 생산성을 높이는 과정이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;두번째로 PIM의 Fixed-function logics과 Programmable cores를 통합적으로 디자인하는 것은 매우 복잡합니다. 이 두 Core는 매우 다른 Programming model로 구현되었습니다. Fixed-function logics의 경우 Assembly-level intrinsics를 통해 ISA-level로 디자인되었습니다. 하지만 Programming cores의 경우 통상적인 프로그래밍 패러다임을 따릅니다. (Threading packages 혹은 GPGPU programming interfaces 같은) 최근의 제시된 대부분의 PIM Architecture의 경우 Homogeneous PIM 구조를 하고 있습니다. (Fixed-function 혹은 Programmable cores 중 하나의 종류만 존재) 그렇기에 더 간단한 Software interface 설계가 가능하지만 Heterogeneous PIM Architecture 설계 시 이 두 가지 요소를 모두 고려하여 설계를 진행해야 합니다. 본 연구에서 더 복잡한 Heterogeneous PIM Architecture를 제시하는 이유는 에너지 효율을 향상시키고, Parallelism과 Programmability 사이에 Balance를 제시하기 위함입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;마지막으로 PIM에서 NN Training처럼 큰 연산 규모는 Hardware utilization의 불균형을 야기시킬 수 있습니다. 이상적으로는 Hardware utilization을 높이기 위하여 NN Training 연산의 dependency를 어기면 안되지만 (Host processor와 PIM 전반에 걸친 operation-level parallelism 방법을 통해) Heterogeneous system에서는 명확한 Hardware scheduling이 어렵기 때문에 이를 이상적으로 실현하기 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;PIM Architecture 연구에서 발생하는 위와 같은 어려움들을 개선하기 위해 본 paper에서는 몇가지 방법을 제시합니다. 먼저 PIM-based NN Training accelaration system을 효율적으로 운용하기 위해 Tensorflow처럼 널리 사용되는 Machie learning framework의 도입을 제시합니다. 위의 목표를 성취하기 위해서는 software/hardware co-design Heterogeneous PIM 설계가 필요합니다. 이번 연구의 설계는 세 가지의 요소를 포함합니다. 먼저 Fixed funcion logic과 Programmable cores를 둘 다 사용하는 Heterogeneous PIM Architecture의 도입입니다. 두 번째로 OpenCL의 기능을 확장하여 PIM programming의 어려움을 개선하려 합니다. 마지막으로 PIM의 H/W Utilization을 최대화 할 수 있는 runtime system을 제시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;-------------------------------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;작성중 - 미완성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PIM/관련 논문</category>
      <category>DNN</category>
      <category>heterogeneous</category>
      <category>Heterogeneous PIM</category>
      <category>PIM</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/7</guid>
      <comments>https://comsys-pim.tistory.com/7#entry7comment</comments>
      <pubDate>Fri, 14 Jan 2022 15:39:53 +0900</pubDate>
    </item>
    <item>
      <title>[NVIDIA] GPU Architecture</title>
      <link>https://comsys-pim.tistory.com/6</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;NVIDIA GPU Architectures&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;b-nvidia-a-20181213.jpg&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnWGOJ/btrqBGCLh2l/RzIChTn3XPbiPjw297UYBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnWGOJ/btrqBGCLh2l/RzIChTn3XPbiPjw297UYBK/img.jpg&quot; data-alt=&quot;[Figure 0] Jenson Huang NVIDIA CEO&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnWGOJ/btrqBGCLh2l/RzIChTn3XPbiPjw297UYBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnWGOJ%2FbtrqBGCLh2l%2FRzIChTn3XPbiPjw297UYBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1333&quot; data-filename=&quot;b-nvidia-a-20181213.jpg&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1333&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 0] Jenson Huang NVIDIA CEO&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;NVIDIA GPU의 Architecture는 세대를 거듭하며 빠른 속도로 발전해 왔습니다. 과거 그래픽 처리를 주 목적으로 했던 GPU에서 벗어나, 현재 (2022년) 전 세계 인공지능 반도체 시장을 선도하고 있는 NVIDIA GPU의 발자취를 따라가보며, GPU의 Architecture가 어떻게 발전되어 왔는지 정리해보려 합니다. (본 포스팅은 Instruction이 수행되는 Streaming Multiprocessor를 중심으로 정리하였습니다.) GPU는 인공지능 분야가 발전함에 따라 많은 양의 데이터를 병렬로 빠르게 처리하기 위하여 도입되었습니다. Throughput 기반의 Architecture라 불리는 GPU는 현재 높은 처리량이라는 강력한 장점을 내세워 인공지능 생태계에 빠르게 적응했고 현재 가장 강력한 인공지능 연산 장치(학습 및 추론)중 하나로 사용되고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;초기 Tesla Architecture부터 Volta Architecture까지 GPU Architecture는 세대를 거듭하며 발전해왔습니다. 공정 기술의 발전과 메모리 기술의 발달에 힘입어 초기 3D 그래픽 가속을 위한 기술들은 다양한 형태의 새로운 기술의 발전으로 이어졌습니다. 세대를 거듭하며 그래픽 처리 뿐 만 아니라 GPGPU(General Purpose GPU)를 위한 기술이 추가되었고, HPC(High Performance Computing) 응용을 고려한 기술들이 추가었습니다. 최종적으로는 강력한 연산 처리 장치인 Tensor Core를 적용한 GPU가 등장하여 DL(Deep Learning)/AI Computing 분야의 대표주자로 우뚝 설 수 있었습니다. 현재 인공지능 처리를 위한 데이터 센터의 대부분은 NVIDIA의 GPU가 섭렵하고 있습니다. 향후 Google의 TPU처럼 필요한 상황에 최적화된 커스텀 칩과 경쟁을 벌이며 최후의 승자를 가리게 되겠지만, 현재 인공지능 기술 발전을 견인하고 있는 NVIDIA의 GPU Architecture 분석은 분명 유의미 한 공부라 판단됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;u&gt;본 포스팅은 Reference [1] [2]의 창작물을 참고하여 만든 2차 창작물입니다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* &lt;u&gt;최근 NVIDIA에서 제시한 'Turing Architecture'와 'Ampere Architecture'는 별도의 포스팅으로 다루겠습니다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[1] Tesla(G80) / 2006&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Tesla Architecture에서 최초로 Vertex shader와 Pixel shader의 기능이 결합된 Unified shader가 등장했습니다. 이를 통해 프로그램 유연성이 증가할 수 있었습니다. 추가적으로 새로운 개념인 *GPGPU가 등장했고 GPU 상에서 그래픽 연산 외에 일반 연산을 가속할 수 있는 CUDA API가 등장하였습니다. 이 Architecture에서 Unified shader 혹은 GPGPU Program을 수행하는 기본 단위는 *Streaming Multiprocessor(SM)으로 각 SM 마다 독립적인 Instruction Scheduler를 사용하여 최대 768개의 Thread를 병렬로 동시에 실행 할 수 있습니다. 각 SM은 8개의 CUDA Cores로 구성되어 있으며 추가적으로 2개의 SFU, Shared memory가 부착되어 있습니다. 아래의 그림을 통해서 SM 하나가 Multi-thread 실행이 가능한 unified shader임을 확인할 수 있습니다. (하나의 TPC에 2개의 SM이 존재하다고 해서 두 SM이 동일 연산을 수행하는 것은 아닙니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D1ZH4/btrqvy4Lry2/yKxNPGZ8U383oWYhKic6W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D1ZH4/btrqvy4Lry2/yKxNPGZ8U383oWYhKic6W0/img.png&quot; data-alt=&quot;[Figure 1] Tesla Architecture의 SM 구조 : Reference [3]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D1ZH4/btrqvy4Lry2/yKxNPGZ8U383oWYhKic6W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD1ZH4%2Fbtrqvy4Lry2%2FyKxNPGZ8U383oWYhKic6W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;589&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] Tesla Architecture의 SM 구조 : Reference [3]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* SM의 구성요소&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;하나의 Streaming Multiprocessor는 8개의 SP(Streaming processor)와 2개의 SFU(Special-Function units)로 이루어져있습니다. 추가적으로 하나의 MT issue(Multithreaded Instruction fetch and issue unit) 공간과 instruction cache, Read만 가능한 Constant cache, 16KByte 크기의 Read/Write shared memory가 존재합니다. 그림에 보이는 SM 하단의 Texture unit은 SM과 외부 메모리 간의 Load/Store 명령어 수행 시에 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SP : 기본적인 Logic / Arithmatic 연산 수행, MAD(Multiply-Add) 명령어를 지원하여 한 clk당 최대 2회 연산 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SFU : 초월함수, Pixel arrtibute 보간 등의 연산 수행, 4개의 부동 소숫점 곱셈기 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Shared memory : Graphics input buffers 또는 병렬 컴퓨팅을 위한 shared data 존재, 이를 통해 실행되는 Thread 간의 Data 교환을 가능하게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*GPGPU : General Purpose GPU&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*SM : Streamin Multiprocessor : Multi thread를 실행할 수 있는 Unified shader&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[2] Fermi / 2010 : 'GPGPU를 위한 발판'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fermi Architecture에서는 이전 Architecture에 비해 General Purpose Computing(GPGPU)을 위한 요소들이 대폭 적용되었습니다. 즉 GPGPU를 용이하게 하기 위한 요소들이 추가된 것인데 기존에 각 SM마다 제공되던 Shared memory의 용량을 추가했으며(16KB =&amp;gt; 64KB), 이 중 일부를 L1 Cache로 설정해 사용할 수 있게되었습니다. (Cache를 사용한다면 Memory 계층구조의 특성을 통해 용량 제한에서 자유로워집니다.) 또한 SM 외부의 Texture unit에 의해 수행되었던 Load/Store 명령이 SM 내의 LD/ST Units으로 대체되며 SM 자체적으로 이 명령어들을 수행할 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zTMK0/btrqu0UCnDk/y9FA6xery4wHeHiJKytu60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zTMK0/btrqu0UCnDk/y9FA6xery4wHeHiJKytu60/img.png&quot; data-alt=&quot;[Figure 2] Fermi Architecture의 SM 구조 / Reference [4]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zTMK0/btrqu0UCnDk/y9FA6xery4wHeHiJKytu60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzTMK0%2Fbtrqu0UCnDk%2Fy9FA6xery4wHeHiJKytu60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;689&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] Fermi Architecture의 SM 구조 / Reference [4]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 Fermi Architecture의 SM 구조를 보여주는 그림으로 원래 SP(Streaming Processor)라 표기되었던 부분이 CUDA Core라는 이름으로 변경되고 그 수도 8개에서 32개로 증가했습니다. 한 SM 내에서 32개의 CUDA Core는 각 16개씩 2개의 그룹으로 나눠져있으며 LD/ST 1그룹과 SFU 1그룹을 포함해 총 4개의 그룹으로 나누어져 있습니다. 또한 Tesl Architecture에서는 하나의 SP 내부에 분산되어 존재하던 Register file들을 모아 밖으로 모아 CUDA Core 외부에 공간을 할당하여 배치하였으며 이를 통해 Register를 보다 효율적으로 사용할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Core(이전 Architecture에서는 SP 개념)의 수가 증가했다는 것은 GPU 내부적으로 더 많은 명령어들을 빠르게 공급해야할 필요가 생겼다는 것을 의미합니다. 따라서 *Warp Scheduler가 2개로 증가했으며 각 Warp Scheduler는 독립적으로 Dispatch Unit을 통해 명령어를 보낼 수 있습니다. 이론적으로 Dispatch Unit이 2개 이기 때문에 한 SM 내에서 2개의 명령어가 독립적으로 실행될 수 있지만 특별한 경우에 한해서는 하나의 SM 내에서 하나의 명령어만 처리하게 됩니다. (특별한 경우라 함은 1. 두 Warp Scheduler에서 사용하려는 실행 유닛 그룹이 겹치는 경우 2. 64Bit 부동소수점 연산을 사용하는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Warp의 단위는 32개의 Thread인데 CUDA Core가 32개 단위로 묶인 것이 아니라 16개로 묶인 이유는 CUDA Cores와 LD&amp;amp;ST, SFU가 Warp Scheduler의 2배 클럭으로 동작하기 때문입니다. 때문에 한 Warp의 32개의 Thread 집합은 두 배 빠르게 동작하는 16개의 CUDA Cores에 할당되어 동작하게 됩니다. 이는 Tesla Architecture도 동일하며 Kepler Architecture에서는 Power Consumption 문제가 대두되며 Scheduler와 동일 클럭으로 동작하도록 변경됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Warp : 같은 명령어로 동시에 실행되는 32개의 Thread의 모음으로 NVIDIA에서는 이를 'Warp'라고 칭함 (AMD의 'Wavefront'와 동일한 개념)&amp;nbsp; 추가적으로 Warp가 존재한다는 것은 한 명령어로 여러 Thread가 실행됨을 의미함으로, 이 동작을 'SIMT(Single Instruction Multi Thread)'라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fused_Multiply_add.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJPUP/btrqpupx8aj/T4KIUWPEXaBmypG3OppJ51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJPUP/btrqpupx8aj/T4KIUWPEXaBmypG3OppJ51/img.png&quot; data-alt=&quot;[Figure 3] MAD(Multiply-Add) vs FMA(Fused Multiply-Add) / Reference [5]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJPUP/btrqpupx8aj/T4KIUWPEXaBmypG3OppJ51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJPUP%2Fbtrqpupx8aj%2FT4KIUWPEXaBmypG3OppJ51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;353&quot; data-filename=&quot;Fused_Multiply_add.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] MAD(Multiply-Add) vs FMA(Fused Multiply-Add) / Reference [5]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 Fermi Architecture에서 적용된 부동소수점 연산인 FMA(Fused Multiply-Add)를 설명하는 그림입니다. 이 연산 방법의 적용으로 부동소수점 연산의 정확도 향상을 성취할 수 있었습니다. 위 그림을 통해 MAD 연산과 FMA 연산의 차이를 확인할 수 있는데 MAD의 경우 중간 계산 결과의 하위 Bits를 버린 다음 최종 결과를 계산하는 반면, FMA 에서는 중간 결과의 모든 하위 Bits를 보존한 상태로 최종 결과를 계산합니다. 기존의 MAD 연산은 계산 결과가 FMA에 비해 부정확하여 그래픽 연산에는 문제가 없었지만 General purpose computing에는 적합하지 않았습니다. 하지만 Fermi Architecture에서 FMA 연산이 지원되며 GPGPU Computing에 대한 지원이 강화되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;추가적으로 CUDA Core 내부에 부동소수점 연산 지원이 추가되어(FP unit) 부동소수점의 성능 또한 향상되었습니다. Tesla Architecture에서는 각 SM 마다 64Bit 부동소수점 연산 유닛을 Core 외부에 별도로 두었지만 Fermi Architecture에서는 CUDA Core 내부에 부동소수점 연산을 위한 Unit을 도입하여 32Bit&amp;nbsp; 부동소수점 연산을 수행하는 CUDA Core 2개를 사용해 효율적으로 64Bit 부동소수점 연산을 수행할 수 있게 되었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[3] Kepler / 2012 &lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;: 'Performance와 Power Consumption을 개선' HPC(High Performance Computing)를 위한 도약&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Kepler Architecture는 이전 Architecture에 비해 성능과 전력 효율을 개선시키는 것을 목표로 개발되었습니다. 클럭의 동작 속도는 전력 소모와 비례 관계에 있습니다. 그렇기 때문에 이전 Architecture에서는 CUDA Cores, LD&amp;amp;ST units, SFU 등이 다른 부분보다 2배 빠르게 동작했지만 Kepler Architecture 부터는 GPU 전체가 동일 클럭으로 동작하도록 변경되었습니다. 이는 GPU의 전반적인 클럭 속도 향상으로 이보다 두배 빠른 속도로 클럭을 동작시키는 것이 어렵고 전력 소모 면에서 큰 문제가 있기 때문입니다. 이전에는 2배 빠른 속도의 클럭을 사용해 성능 향상에 사용하였지만 절반 속도의 클럭으로도 동일한 성능 혹은 더 좋은 성능을 내기 위해선 실행 유닛의 갯수가 2배 이상이 되어야 합니다. 그렇기 때문에 Kepler Archiecture에서는 훨씬 더 많은 실행 유닛을 도입하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ea43n7/btrqAyQRO2Q/Kl4KKEhLDoQVvkWsT5mep1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ea43n7/btrqAyQRO2Q/Kl4KKEhLDoQVvkWsT5mep1/img.png&quot; data-alt=&quot;[Figure 4] Kepler Architecture의 SMX 구조 / Reference [6]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ea43n7/btrqAyQRO2Q/Kl4KKEhLDoQVvkWsT5mep1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fea43n7%2FbtrqAyQRO2Q%2FKl4KKEhLDoQVvkWsT5mep1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;924&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] Kepler Architecture의 SMX 구조 / Reference [6]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 Kepler Architecture의 Streaming Multiprocessor(SM)의 구조를 나타냅니다. Kepler Architecture부터 SM이 SMX라는 이름으로 변경되었으며 2배의 클럭 속도를 사용하지 않고 성능을 향상시키기 위하여 훨씬 많은 실행 유닛들을 도입했음을 확인할 수 있습니다. Kepler의 SMX에서는 192개의 CUDA Cores, 64개의 *64-Bit DP units, 32개의 LD&amp;amp;ST units, 32개의 SFU로 구성되어 있습니다. 늘어난 실행 유닛을 효과적으로 사용하기 위하여 Warp Scheduler의 갯수도 2개에서 4개로 증가했으며 각 Warp Scheduler unit에 대응되는 Dipatch unit 또한 1개에서 2개로 증가해 SMX에서는 동시에 최대 8개의 명령어를 처리하는 것이 가능해졌습니다. 또한 Register file 크기도 최대 128KB로 4배 가량 증가했으며 L1 Cache의 크기 또한 128KB로 Fermi SM의 2배가 되었음을 알 수 있습니다. 추가적으로 하나의 Thread가 사용할 수 있는 최대 Register의 수가 63개에서 255개로 늘어났는데 이는 DP unit의 갯수가 증가한 것과 더불어 그래픽 연산보다 High Performance Computing(HPC) 응용 분야의 성능 향상을 위한 변화라고 판단됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;또한 명령어 처리 효율 향상을 위하여 명령어 Scheduling 방법에도 많은 변화가 생겼습니다. 아래의 그림은 이전 Architecture인 Fermi와 새롭게 제시된 Kepler의 Scheduling 방법을 비교한 그림입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Kepler_Scheduler.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzH0Os/btrquOA2ObS/5T4w8OQe3KWxIIHWVKtBX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzH0Os/btrquOA2ObS/5T4w8OQe3KWxIIHWVKtBX0/img.jpg&quot; data-alt=&quot;[Figure 5] Fermi Architecture scheduling vs Kepler Architecture scheduling / Reference [7]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzH0Os/btrquOA2ObS/5T4w8OQe3KWxIIHWVKtBX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzH0Os%2FbtrquOA2ObS%2F5T4w8OQe3KWxIIHWVKtBX0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;563&quot; data-filename=&quot;Kepler_Scheduler.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 5] Fermi Architecture scheduling vs Kepler Architecture scheduling / Reference [7]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Fermi Architecture의 경우 CUDA Core, LD/ST unit, SFU 내부의 파이프라인 상에서 진행중인 명령어들의 수행이 완료되었는지 확인하는 Scoreboard 회로와 이를 바탕으로 다음에 실행될 명령어 사이의 Dependency를 동적으로 확인하는 Dependency Check 회로가 존재했습니다. 이는 명령어들이 파이프라인 상에서 진행될 때 명령어 사이의 Dependency 때문에 Data hazard가 발생하는 상황을 예방하기 위한 회로입니다. 하지만 Kepler Architecture에서는 한 번에 처리하는 명령어가 4개에서 8개로 늘어나고 실행 유닛 그룹의 갯수 또한 크게 증가했기 때문에 위의 조건을 모두 고려해 회로를 설계한다면 Scheduling 회로의 복잡성이 너무 증가하게 됩니다. 하여 Kepler에서는 Compiler에 미리 명령어 실행을 완료하기 위한 필요 Cycle 수를 명령어와 함께 사용하여 다음에 실행할 명령어를 선택함으로써 Scoreboard와 Dependency check 회로 없이 간단한 방법으로 Scheduling을 구현할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*64Bit DP Units : 64Bit 부동소수점 연산을 위한 Double Precision units으로 High Performance Computing(HPC)를 위해 도입됨, Fermi Architecture과 달리 32-Bit 연산과 64-Bit 부동소수점 연산이 동시에 실행될 수 있어 성능이 크게 향상됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[4] Maxwell / 2014, 2015 : '미세 공정 도움 없이 Kepler Architecure 최적화'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Maxwell Architecture가 발표되던 시기는 이전 세대의 GPU Architecture가 발전하던 방향과 조금 다른 방향으로 GPU의 개발이 이루어졌습니다. Kepler Architecture 까지는 데스크탑에서의 사용을 최우선으로 고려하여 발전이 진행되었다면 Maxwell Architecture 에서는 이를 Mobile device에 최적화 하려는 노력이 있었습니다. 또한 이전 Architecture의 경우 세대를 거듭하며 공정 기술의 발달이 동반되며(전보다 더 적은 공간에 더 많은 Tr을 배치할 수 있었음) 클럭 속도를 높이거나 CUDA Core의 갯수를 늘려 성능을 향상시키는 것이 가능했다면 Maxwell Architecture가 도입되는 시점에는 반도체 공정이 28nm에 머물러 있었습니다. 때문에 Maxwell Architecture에서는 공정 기술의 발달에 의한 이득을 볼 수 없었기에 Kepler Architecture를 최적화 하는 방향으로 개발이 진행되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GeForce_GTX_980_SM_Diagram-545x1024.png&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKYlGh/btrqvyEOuJr/BmXp8Nwsh4PHyEdR99wobK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKYlGh/btrqvyEOuJr/BmXp8Nwsh4PHyEdR99wobK/img.png&quot; data-alt=&quot;[Figure 6] Maxwell Architecture의 SMM 구조 / Reference [8]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKYlGh/btrqvyEOuJr/BmXp8Nwsh4PHyEdR99wobK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKYlGh%2FbtrqvyEOuJr%2FBmXp8Nwsh4PHyEdR99wobK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;1159&quot; data-filename=&quot;GeForce_GTX_980_SM_Diagram-545x1024.png&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 6] Maxwell Architecture의 SMM 구조 / Reference [8]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위의 그림은 Maxwell Architecture의 SMM 구조입니다. Kepler Architecture의 SMX에서 192개였던 CUDA Cores의 갯수가 128개로 크게 줄었는데 이는 Kepler Architecture의 SMX에서 Dispatch Unit에 비해 CUDA Cores의 갯수가 너무 많아 CUDA Cores utilization 저하가 발생했기 때문으로 판단됩니다. (Dispatch unit에 비해 너무 CUDA Cores가 많아 연산이 실행될 때 쓰이지 않고 놀게 되는 CUDA Cores가 발생함) NVIDIA의 분석에 따르면, CUDA Cores의 수를 192개에서 128개로 대폭 줄이더라도 SMM의 성능 저하는 10%정도 밖에 되지 않는다고 합니다. Shared memory 관련해서도 변화가 있었는데 이전 Architecture에서는 Shared memory의 일부를 L1 Cache로 설정해 사용할 수 있었지만 Maxwell 부터는 Shared memory와 L1 Cache가 분리되었습니다. (L1 Cache는 texture cache로도 사용됩니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;SMM 내부의 CUDA Cores의 갯수가 줄어들었기 때문에 하나의 SMM이 차지하는 면적 또한 줄어들었습니다. 따라서 SMM의 갯수를 두배로 늘렸지만 칩 전체가 차지하는 면적을 이전 아키텍쳐의 2배보다 작게 배치할 수 있었습니다. Kepler Architecture의 GK104 GPU의 경우 8개의 SMX를 탑재하여 1536개(8 x 192)의 CUDA Cores를 갖고 있는 반면 Maxwell Architecture의 GM204의 경우 그 2배인 16개의 SMM을 탑재하고 있습니다. 따라서 GM204는 총 2048개(16 x 128)의 CUDA Cores를 갖게 됩니다. 칩의 면적은 두 모델 모두 CUDA Cores의 수에 거의 비례하지만 Maxwell Architecture에서 SMM의 수가 두배로 늘었기 때문에 1.8배에 준하는 성능 향상을 도출할 수 있었습니다. (이론상 Peak 성능은 아닙니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Maxwell SMM에 적용된 큰 변화 중 하나는 64Bit 부동소수점 연산을 위한 Double precision unit의 갯수가 Kepler의 SMX에 비해 크게 줄어들었다는 점입니다. Warp Scheduler 하나 당 1개의 DP 유닛이 존재하는 것으로 판단되는데 이 때문에 Maxwell Architecture와 64Bit 부동소수점 연산 성능은 32Bit 연산 성능에 비해 1/32 수준으로 크게 후퇴하였습니다. 이는 많은 사용자들이 사용하는 FP32 연산의 중요성을 강조한 조치라 판단됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Loaa6/btrqLTVBgHO/VNKkp8b7Gsy8c8RunEfQr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Loaa6/btrqLTVBgHO/VNKkp8b7Gsy8c8RunEfQr0/img.png&quot; data-alt=&quot;[Figure 12] Kepler Architecture의 data path(좌) vs Maxwell Architecture의 data path(우) / Reference [14]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Loaa6/btrqLTVBgHO/VNKkp8b7Gsy8c8RunEfQr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLoaa6%2FbtrqLTVBgHO%2FVNKkp8b7Gsy8c8RunEfQr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;519&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 12] Kepler Architecture의 data path(좌) vs Maxwell Architecture의 data path(우) / Reference [14]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Maxwell Architecture에는 전력 효율을 위한 최적화 기법 또한 적용되었습니다. 위의 그림은 Kepler Architecture의 Dispatch Unit과 실행 유닛 사이의 연결 구조와(좌) Maxwell Architecture의 연결 구조(우)입니다. 그림을 통해 알 수 있듯이 Kepler Architecture의 경우 모든 실행 유닛이 하나의 crossbar 스위치로 연결되어 있습니다. 이런 경우 8개의 Dispatch unit들은 각각 어떤 실행 유닛이든 자유롭게 접근 할 수 있는 장점이 있지만 모든 node를 연결한 crossbar가 칩에서 큰 면적을 차지하게 됩니다. 많은 면적을 차지하기에 많은 전력을 소비하게 되고 전력 소비를 효율적으로 하기 위해서 Maxwell Architecture에서는 Dispatch unit과 실행 Unit들 사이를 구분해 배치하였습니다. Maxwell Architecture의 경우 SMM에서 실행 유닛들을 4 그룹으로 분류하고 4 쌍의 Ditpatch unit이 각 그룹 중 하나만 접근할 수 있도록 제한하였는데 이런 경우 한 쌍의 두 Dispatch unit이 동일 실행 unit을 사용하려 하는 경우 하나의 명령어밖에 실행하지 못할 가능성이 높아지지만 이로 인한 성능 저하보다 전력 소모와 칩 면적 감소에 더 집중하였음을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;전력 소비 효율 증대를 위한 또 다른 변화는 L2 Cache의 크기가 이전 Architecture에 비해서 512KB에서 2MB로 크게 늘었다는 것입니다. 프로세서 외부 메모리인 GDDR5의 전력소모는 얼마나 자주 메모리에 접근하는 지에 영향을 받게 되는데 L2 Cache의 용량을 늘림으로써 외부 메모리 사용을 줄여 GPU 전체의 전력 소모를 줄일 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[5] Pascal / 2016 : 'Deep Learning Boom, GPU를 새로운 혁신으로 이끌다.'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Pascal Architectue가 등장한 시기는 이미 전세계 적으로 딥러닝 붐이 일어났던 시기입니다. 많은 기업들이 AI 분야에 GPU를 사용하였고 이와 관련한 개발자도 빠르게 늘었습니다. NVIDIA는 GPU에 국한된 것이 아니라 AI회사로 불리기 원했는데 '2016 GPU Tech Conference' 내용을 보더라도 3D 그래픽 관련 내용보다 딥러닝과 AI에 관련된 내용에 훨씬 많은 발표 시간을 할애함을 알 수 있습니다. 따라서 NVIDIA에서는 딥러닝 프로그램에 적합한 Architecture 구현을 위해 많은 노력을 했습니다. Pascal Architecture의 Streaming Multiprocessor는 이전 세대와 달리 두 가지 종류로 나뉘어 발표되었는데 이는 HPC(High Performance Computing) 분야와 그래픽 분야에서 요구되는 성능이 달라졌기 때문입니다. 딥러닝 혹은 HPC 응용 프로그램들은 FP64연산과 FP16연산(64bit, 16bit 부동소수점 연산) 성능이 중요하며 하나의 Thread가 많은 레지스터를 사용하는 것이 중요하지만, 그래픽 분야의 Shader 프로그램에서는 FP32만을 주로 사용하고, 프로그램이 상대적으로 간단하기 떄문에 레지스터 수를 늘려도 성능에 큰 영향을 미치지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7r83D/btrqGbIyLO1/mnednsqXkB1X4jR4sWMaFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7r83D/btrqGbIyLO1/mnednsqXkB1X4jR4sWMaFK/img.png&quot; data-alt=&quot;[Figure 7] GP100 Pascal Architecture의 SM 구조 / Reference [9]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7r83D/btrqGbIyLO1/mnednsqXkB1X4jR4sWMaFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7r83D%2FbtrqGbIyLO1%2FmnednsqXkB1X4jR4sWMaFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;865&quot; height=&quot;626&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 7] GP100 Pascal Architecture의 SM 구조 / Reference [9]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 그림은 GP100 Pascal Architecture의 Streaming Multiprocessor의 구조를 보여주고 있는데 Maxwel의 SMX에 비해 한 SM 당 CUDA Cores를 비롯한 실행 유닛의 갯수는 반으로 줄었습니다.(64개) 실행 유닛의 수가 반으로 줄어들었지만 레지스터 파일의 크기는 그대로 유지되었는데 이를 통해 Warp Scheduler 하나 당 접근할 수 있는 레지스터는 두배로 늘어 Pascal의 SM에서 실행되는 Thread는 이전보다 더 많은 레지스터를 사용할 수 있습니다. 또한 공정 기술이 28nm에서 16nm로 발전하여 GPU 내에 탑재되는 SM의 수가 크게 증가했는데 Kepler Architecture의 경우 16개 혹은 24개의 SMM을 탑재했지만 Kepler Architecture의 경우 무려 56개의 SM을 탑재하고 있습니다. 많은 SM을 사용하여 DL 연산의 경우 신경망 연산에서 12배 이상 빨라졌고 이전 Architecture에 비해 딥러닝 추론 처리량이 약 7배 증가했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GP100모델에 적용된 Pascal Architecture의 경우 HPC(High Performance Computing) workroad 지원을 목표로 설계되었기 때문에 FP64의 성능이 다시 강조되었습니다. (정확한 연산 결과를 요구하는 HPC 분야의 경우 Double precision인 FP64연산이 중요합니다. ex.정확한 과학적 연산 결과 도출 등) Maxwell Architecture에서 FP32 성능 대비 1/3 혹은 1/32였던 FP64 성능이 Pascal에서는 1/2로 크게 향상되었습니다. 추가적으로 딥러닝 연산에서 더 많은 연산을 빠르게 하기 위하여 FP16연산을 새롭게 도입하였는데, 이는 FP16 연산을 통해 딥러닝의 Traning과 Inference에서 더 높은 Throughput을 내기 위한 조치라 판단됩니다. FP100 Pascal에 사용된 CUDA Core의 경우 FP16연산을 처리할 때 한 Cycle에 두 명령어를 처리할 수 있기 때문에 FP16 연산은 FP32 연산에 비해 두 배 빠르게 처리될 수 있어 계산 속도 면에서도 큰 장점이 있습니다. (기존의 Architecture에서는 FP16연산을 위해서 32Bit 크기의 공간 중 16Bit만 사용하고 나머지 16Bit는 버리는 공간이었음) FP16연산의 경우 *Half precision에 사용되는 연산인데 연산의 정확도가 결과에 큰 영향을 미치지 않는 DL 분야에서 Half precision의 경우 매우 효율적으로 사용될 수 있음이 많은 연구 결과로 밝혀졌습니다. (높은 precision의 연산을 수행할 경우 연산의 정확도는 높지만, 낮은 precision을 사용하여 더 많은 Throughput을 내는 것이 DL 연산 성능에 더 큰 영향을 미침)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tf32-Mantissa-chart-hi-res-FINAL-400x255.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMUojq/btrqGU0JcFi/7cYJ5BYya4JhCDyAn7gQz0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMUojq/btrqGU0JcFi/7cYJ5BYya4JhCDyAn7gQz0/img.webp&quot; data-alt=&quot;[Figure 8] NVIDIA 에서 사용하는 Precision format / Reference [10]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMUojq/btrqGU0JcFi/7cYJ5BYya4JhCDyAn7gQz0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMUojq%2FbtrqGU0JcFi%2F7cYJ5BYya4JhCDyAn7gQz0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;368&quot; data-filename=&quot;tf32-Mantissa-chart-hi-res-FINAL-400x255.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 8] NVIDIA 에서 사용하는 Precision format / Reference [10]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*Half precision : 컴퓨터에서 소수를 표현하는 방식 중 하나로 소수를 32bit data로 표현하는 것이 Single precision, 64bit data로 표현하는 것이 Double precision, 마지막으로 16bit data로 표현하는 것이 Half precision&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*HPC 연산 vs DL 연산 : HPC 연산의 경우 정확한 연산 결과를 요하기 때문에 Double precision(FP64) 연산을 요하지만, DL 연산의 경우 높은 처리량이 목표이기 때문에 Half precision(FP16) 연산이 효율적임. 이 두 연산은 이론적으로 상반되는 워크로드를 가짐&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[6] Volta / 2017 : 'Tensor Cores의 등장, NVIDIA를 Deep Learning acceleration의 정점으로'&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Volta Architecture의 경우 12nm의 FinFET 공정으로 구현되었으며 엄청난 수(약 211억개)의 Transistor를 탑재하고 있습니다. 또한 DL 가속을 위한 새로운 연산 유닛인 Tensor Cores의 도입으로 Volta Architecture에서 혁신적인 성능 향상을 이룰 수 있습니다. Tensor Cores의 경우 DL 가속을 위해 특별히 제작된 Core 입니다. Tensor Cores는 16Bit의 부동소수점 연산으로 이루어진 매트릭스 D를 계산하는 동작을 Pascal에 비해 12배 높은 Throughput으로 처리할 수 있습니다. 딥러닝 연산의 경우 Neural Network의 각 Layer와 Node 사이의 Weight를 이용해 다음 Layer로의 출력을 계산할 때 매트릭스 연산이 사용되기 때문에 이를 가속하기 위한 전용 Core의 존재는 DL 연산에 매우 혁신적인 요소입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;(Volta architecture의 경우 공정기술의 성장과 새로운 연산 유닛의 도입 외에도 Thread 실행, Thread Scheduling 기법, Core layout, Memory controller, ISA 면에서도 기존의 Architecture에 비해 상당한 차이를 보입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;tensor_core-e1496217242264.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYazuT/btrqAcoQy3R/kNf8IX3kqWMRJhcDQWZy0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYazuT/btrqAcoQy3R/kNf8IX3kqWMRJhcDQWZy0K/img.png&quot; data-alt=&quot;[Figure 9] Tensor Core / Reference [12]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYazuT/btrqAcoQy3R/kNf8IX3kqWMRJhcDQWZy0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYazuT%2FbtrqAcoQy3R%2FkNf8IX3kqWMRJhcDQWZy0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;495&quot; data-filename=&quot;tensor_core-e1496217242264.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 9] Tensor Core / Reference [12]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아래의 그림은 Volta architecture의 SM 구조를 나타내고 있습니다. 새로운 Architecture에서 Chip당 84개의 SM이 포함되어 있습니다. 기존의 CUDA Cores의 경우 FP32 Cores로 이름이 변했고 기존 Architecture에서 가장 많은 부분을 차지했던 FP32 Core와 동일한 수의 정수 연산 Cores(INT Core)가 추가되었는데 이는 DL 연산의 가속을 위한 요소입니다. FP64 Cores의 경우 Pascal Architecture와 동일한 비율로 FP32 Cores의 절반이 탑재되었으며 Warp Scheduler마다 2개의 Tensor Core가 짝을 이루고 있음을 확인할 수 있습니다. 추가적으로 전에 없던 L0 Cache가 추가되었음을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;volta_sm_575px.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;897&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LWotG/btrqBIghPRQ/hVlkPSAeb22OmfOGvpwuc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LWotG/btrqBIghPRQ/hVlkPSAeb22OmfOGvpwuc0/img.png&quot; data-alt=&quot;[Figure 10] Volta Architecture의 SM구조 / Reference [13]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LWotG/btrqBIghPRQ/hVlkPSAeb22OmfOGvpwuc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLWotG%2FbtrqBIghPRQ%2FhVlkPSAeb22OmfOGvpwuc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;897&quot; data-filename=&quot;volta_sm_575px.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;897&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 10] Volta Architecture의 SM구조 / Reference [13]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;추가적으로 Pascal Architecture 까지는 하나의 Warp를 이루고 있는 32개의 Thread는 반드시 동시에 진행을 했지만 Volta Architecture의 경우 아래 그림과 같이 하나의 Warp 내에서 32개의 Thread 각각이 독립적인 PC(Program Counter)를 갖고 독립적으로 진행하는 것이 가능해졌습니다. 이는 원래 Warp scheduler와 짝을 이루던 Dispatch unit의 수가 변한 이유중 하나로 판단됩니다. 위와 같은 변화가 생겼던 이유는 실행 유닛의 종류가 다양해지면서 (FP16, FP32, FP64, INT Core, LD&amp;amp;ST, Tensor Core, SFU) 각 실행 유닛 별 Latancy 차이로 발생하는 비효율을 피하기 위한 조치라 판단됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;voltasimt.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;495&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d202Ey/btrqHeEUgYh/kToSaX7ozt79DmAfFNwi9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d202Ey/btrqHeEUgYh/kToSaX7ozt79DmAfFNwi9K/img.png&quot; data-alt=&quot;[Figure 11] Volta Architecture의 Thread Scheduling 변화 / Reference [13]&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d202Ey/btrqHeEUgYh/kToSaX7ozt79DmAfFNwi9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd202Ey%2FbtrqHeEUgYh%2FkToSaX7ozt79DmAfFNwi9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;495&quot; data-filename=&quot;voltasimt.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;495&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 11] Volta Architecture의 Thread Scheduling 변화 / Reference [13]&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Streaming Multiprocessor의 구조는 GPU Architecture가 발전하며 함께 성장해 왔습니다. 초기 Tesla, Fermi Architecture 시기에는 GPU의 동작 속도가 현재보다 느렸고 공정상의 제약 때문에 칩 면적을 효율적으로 사용하는 것이 중요했습니다. 때문에 SM을 두배 빠른 속도로 동작시켜 원하는 성취를 이룰 수 있었습니다. 하지만 Kepler Architecture가 도입되며 칩이 차지하는 면적보다 전력 효율 문제가 대두되며 SM을 두배 빠르게 동작시키는 방법 대신 CUDA Cores의 수를 두배로 늘려 원하는 성취를 이루었습니다.(이는 공정 기술의 발달에 영향을 받았습니다.) 하지만 다음 Architecture인 Maxwell의 경우 Kepler와 동일한 28nm의 공정을 계속 사용했기 때문에 Kepler Architecture를 철저하게 분석해 SM 하나 당 필요한 CUDA Core의 갯수를 최적화 했으며 효율성과 성능을 향상시켰습니다. (하지만 FP64 연산 성능은 이전보다 안좋아졌습니다.) 딥러닝 붐이 일어난 시기에 등장한 Pascal Architecture는 DL 연산을 위한 자원을 늘리기 위하여 FP16 연산 성능을 FP32 연산에 비해 두 배로 늘렸으며(FP16연산은 FP32 연산보다 정확도는 떨어지지만 더 많은 Throughput을 낼 수 있습니다.) Warp Scheduler 하나가 접근할 수 있은 Register 파일 또한 두 배로 늘렸습니다. Volta Architecture의 경우 DL 연산을 더욱 가속하기 위해 새롭게 도입된 개념인 Tensor Core가 적용되었으며 4x4 매트릭스 연산을 Pascal 보다 무려 12배 빠르게 수행할 수 있었습니다. *Tensor Core 관련 자세한 내용은 이전 포스트를 참고해주세요.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[1] &lt;a href=&quot;http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ec%83%81%ed%8e%b8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ec%83%81%ed%8e%b8/&lt;/a&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[2] &lt;a href=&quot;http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ed%95%98%ed%8e%b8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.donghyun53.net/nvidia-gpu-%ec%95%84%ed%82%a4%ed%85%8d%ec%b2%98-%eb%b3%80%ec%b2%9c%ec%82%ac-%ed%95%98%ed%8e%b8/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[3] &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Lindholm, Erik, et al. &quot;NVIDIA Tesla: A unified graphics and computing architecture.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;IEEE micro&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;28.2 (2008): 39-55.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[4] &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Aila, Timo, Samuli Laine, and Tero Karras. &quot;Understanding the efficiency of ray traversal on GPUs&amp;ndash;Kepler and Fermi addendum.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;Proceedings of ACM High Performance Graphics&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2012): 9-16.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[5] &amp;ldquo;NVIDIA&amp;rsquo;s&amp;nbsp;Next&amp;nbsp;Generation&amp;nbsp;CUDA&amp;nbsp;Compute&amp;nbsp;Architecture:&amp;nbsp;Fermi&amp;rdquo;,&amp;nbsp;White&amp;nbsp;Paper&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[6] &amp;ldquo;NVIDIA&amp;rsquo;s&amp;nbsp;Next&amp;nbsp;Generation&amp;nbsp;CUDA&amp;nbsp;Compute&amp;nbsp;Architecture:&amp;nbsp;Kepler&amp;nbsp;TM&amp;nbsp;GK110/210&amp;rdquo;,&amp;nbsp;&amp;nbsp;White&amp;nbsp;Paper&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[7] &lt;a href=&quot;https://www.anandtech.com/show/6446/nvidia-launches-tesla-k20-k20x-gk110-arrives-at-last/3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.anandtech.com/show/6446/nvidia-launches-tesla-k20-k20x-gk110-arrives-at-last/3&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[8] &lt;a href=&quot;https://developer.nvidia.com/blog/maxwell-most-advanced-cuda-gpu-ever-made/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/blog/maxwell-most-advanced-cuda-gpu-ever-made/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[9] &quot;Whitepaper,&amp;nbsp;NVIDIA&amp;nbsp;Tesla&amp;nbsp;P100,&amp;nbsp;The&amp;nbsp;Most&amp;nbsp;Advanced&amp;nbsp;Datacenter&amp;nbsp;Accelerator&amp;nbsp;Ever&amp;nbsp;Built&amp;nbsp;Featuring&amp;nbsp;Pascal&amp;nbsp;GP100,&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;the&amp;nbsp;World&amp;rsquo;s&amp;nbsp;Fastest&amp;nbsp;GPU&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[10] &lt;a href=&quot;https://www.nvidia.com/en-us/data-center/pascal-gpu-architecture/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.nvidia.com/en-us/data-center/pascal-gpu-architecture/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[11] &lt;a href=&quot;https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[12] Youtube &quot;GTC&amp;nbsp;2017:&amp;nbsp;NVIDIA&amp;nbsp;Announces&amp;nbsp;Tesla&amp;nbsp;V100&amp;nbsp;(NVIDIA&amp;nbsp;keynote&amp;nbsp;part&amp;nbsp;6)&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[13] &lt;b&gt;&lt;a href=&quot;https://www.anandtech.com/show/11367/nvidia-volta-unveiled-gv100-gpu-and-tesla-v100-accelerator-announced&quot;&gt;https://www.anandtech.com/show/11367/nvidia-volta-unveiled-gv100-gpu-and-tesla-v100-accelerator-announced&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[14] &lt;a href=&quot;http://www.donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%ED%95%98%ED%8E%B8/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.donghyun53.net/nvidia-gpu-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B3%80%EC%B2%9C%EC%82%AC-%ED%95%98%ED%8E%B8/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>GPU</category>
      <category>architecture</category>
      <category>CUDA</category>
      <category>GPGPU</category>
      <category>GPU</category>
      <category>HPC</category>
      <category>nvidia</category>
      <category>Streaming Multiprocessor</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/6</guid>
      <comments>https://comsys-pim.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 13 Jan 2022 17:22:13 +0900</pubDate>
    </item>
    <item>
      <title>[NVIDIA] CUDA Cores vs Tensor Cores</title>
      <link>https://comsys-pim.tistory.com/5</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;NVIDIA_GPU.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1088&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLl9Q6/btrp00HKhEk/PM4gXzPOSCZk9YTQTF86Ck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLl9Q6/btrp00HKhEk/PM4gXzPOSCZk9YTQTF86Ck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLl9Q6/btrp00HKhEk/PM4gXzPOSCZk9YTQTF86Ck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLl9Q6%2Fbtrp00HKhEk%2FPM4gXzPOSCZk9YTQTF86Ck%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;521&quot; data-filename=&quot;NVIDIA_GPU.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1088&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU(Graphics proccessing unit)는 그래픽 연산을 빠르게 처리하기 위해 고안된 그래픽 처리 장치입니다. 이 용어는 1999년 NVIDIA사에서 'geforce 256 model'을 발표하며 처음 사용하기 시작했으며 현재는 다양한 Data sets를 병렬로 처리해야하는 인공지능 연산 분야에서 그 사용성이 입증되며 광범위한 분야로 확장되고 있습니다. NVIDIA는 이런 GPU의 범용성을 인지하고 GPU를 단순히 그래픽 연산을 처리하기 위한 장치가 아닌, CPU처럼 'General Purpose(범용적)'으로 사용하기 위해 많은 공을 들였습니다. 또한 C, C++와 같은 고급 언어로 프로그래밍할 수 있도록 *CUDA라는 병렬 컴퓨팅 플랫폼을 세상에 공개했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GPU.png&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MpyBs/btrp2B1Nwqc/uNSNLWoTv5WC3KOUVkMjN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MpyBs/btrp2B1Nwqc/uNSNLWoTv5WC3KOUVkMjN0/img.png&quot; data-alt=&quot;[Figure 1] CPU vs GPU&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MpyBs/btrp2B1Nwqc/uNSNLWoTv5WC3KOUVkMjN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMpyBs%2Fbtrp2B1Nwqc%2FuNSNLWoTv5WC3KOUVkMjN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;353&quot; data-filename=&quot;GPU.png&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;829&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 1] CPU vs GPU&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CPU와 마찬가지로 GPU 내부에도 연산을 처리할 수 있는 Core들이 존재합니다. 하지만 CPU와 GPU Core 구성에는 큰 차이가 존재합니다. CPU는 하나의 Core가 순차적으로 직렬 처리되는 프로세스를 효율적으로 처리하기 위해 만들어졌습니다. 즉, 단일 Core 성능을 GPU와 비교한다면 월등히 뛰어나다고 할 수 있습니다. 하지만 GPU는 병렬 처리를 기반으로 한 아키텍쳐를 채택해 설계되었기 때문에 여러 Data들을 병렬로 효율적으로 처리할 수 있습니다.(위의 이유로 GPU를 Throughput 기반의 Architecture라고 부르기도 합니다.) CPU보다 더 단순한 Core들로 구성되어 있지만 CPU가 일반적으로 1에서 8개의 Core를 갖는 것에 비해 GPU는 보통 수백에서 수천 개의 Core를 갖습니다. 때문에 많은 양의 Data sets를 병렬로 처리해야 하는 AI 연산에 GPU가 선호되고 있습니다. GPU의 Core는 더 작은 용량의 Cache, 작은 Instruction set, 낮은 Clock rate를 갖습니다. 그렇지만 CPU보다 매우 많은 Core가 밀집되어 있기 때문에 병렬 처리에 유용합니다. GPU 내에서 CUDA Core의 수는 더 좋은 Computing performance를 낼 수 있다는 말과 동일합니다. 하지만 GPU의 서로 다른 세대 간의 성능을 비교할 때는 단순히 Core의 수 만으로 비교할 수는 없습니다. GPU 안에서도 세대를 변화하며 단일 Core의 성능이 달라지기 때문입니다. 최신 NVIDIA GPU 안에는 세 가지 종류의 Core가 존재합니다. (1) CUDA cores (2) Tensor cores (3) Ray-Tracing cores 각 Core 들은 서로 다른 목적을 위해 설계되었습니다. 하여, 이번 게시글을 통해 CUDA cores와 Tensor cores 의 차이점에 대해 알아보고 각 Core가 GPU 성능에 미치는 영향에 대해 고찰하려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*CUDA : Compute Unified Device Architecture&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CUDA cores?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;GPU 상에서 CUDA Cores가 하는 일은 근본적으로 CPU 내부의 Core가 하는 일과 유사합니다. (하지만 CPU와 달리 Instruction을 가져오거나 Decodeing 할 수는 없습니다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;표.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsxcqP/btrp54RbYty/alfGxF2XnniJs6MILTkxQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsxcqP/btrp54RbYty/alfGxF2XnniJs6MILTkxQ0/img.png&quot; data-alt=&quot;[Figure 2] CPU vs GPU&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsxcqP/btrp54RbYty/alfGxF2XnniJs6MILTkxQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsxcqP%2Fbtrp54RbYty%2FalfGxF2XnniJs6MILTkxQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;225&quot; data-filename=&quot;표.png&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 2] CPU vs GPU&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;구조적으로 CPU는 큰 크기의 Cache memory와 함께 한 번에 몇 개의 Thread를 처리할 수 있는 소수의 Core로 구성됩니다. 이와 대조적으로 GPU는 수천 개의 Thread를 동시에 처리할 수 있는 수백에서 수천 개의 CUDA Core로 구성됩니다. 이를 통해 GPU는 CPU보다 훨씬 많은 작업을 빠르게 처리할 수 있으며 이런 특징을 통해 AI분야의 Deep Learning 연산에서 핵심적인 역할을 맡을 수 있었습니다. 일반적으로 CUDA Cores는 Tensor Cores에 비해 느리지만 fp32 연산을 수행하기 때문에 더 정확한 연산을 수행할 수 있습니다. (Tensor Cores 는 fp16 연산이기 때문에 계산 정확도를 어느 정도 희생해야 합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그렇다면 CUDA Cores 가 GPU의 성능에 어떤 영향을 미칠까요? 단순히 CUDA Cores의 수로 GPU의 성능을 판단하기에는 많은 제한 조건들이 있습니다. 어떤 GPU Architecture를 채택했는가 부터 *GPU Clock speeds, Memory Bandwidth, Meory speed, TMUs, *VRAM, ROPs 등은 성능에 영향을 미치는 요소들 입니다. 하지만 동일한 GPU Architecture 내에서는 이런 조건들이 비슷하기 때문에 CUDA Cores의 수로 성능을 비교할 수 있습니다. 많은 CUDA Cores는 Performance bottleneck 현상을 일으키는 다른 요인이 없는 경우 같은 Generation에서 더 좋은 성능을 의미합니다. 하지만 다른 Generation 사이에서 성능을 비교하는 경우는 이와 상황이 다릅니다. 예를 들어 GTX 1070은 GTX 780과 거의 동일한 수의 CUDA Core를 갖고 있지만 성능 면에서 월등한 차이를 갖고 있습니다. 이런 성능 차이는 단일 Core의 성능 차이와 세대를 거듭하며 발전하는 제조 공정 차이, 트랜지스터의 크기 차이 등에 기인한 것으로 판단됩니다. GTX 980 Ti(Maxwell architecture)와 GTX 980 Ti(Pascal architecture)의 경우는 비슷한 수의 CUDA Core와 Transistor가 존재하지만 트랜지스터의 크기가 이 둘의 성능을 비교하는 데에 결정적인 역할을 했습니다. 더 작은 Transistor를 사용하는 Pascal architecture의 전력 소비 감소로 작은 공간에 많은 트랜지스터를 집적할 수 있었으며 이를 통해 최대 Clock frequency를 증가시킬 수 있었습니다. Clock frequency의 증가로 단일 Core가 더 빠르게 작업을 수행할 수 있었으며 이는 두 Architecture 간의 성능 차이로 이어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;NVIDIA에서 자사의 GPU Cores를 CUDA Core로 명명한 것 처럼 AMD 사에서는 이를 Stream Processor라고 부릅니다. 두 회사의 Architecture가 근본적으로 다르게 설계되었기 때문에 CUDA Cores의 수와 Stream processor의 수만 보고 성능을 비교할 수는 없습니다.&amp;nbsp;하지만 Benchmark simulation을 통해 두 Architecture의 성능을 보다 정확히 비교할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*GPU Clock speeds : Core Clock speed(GPU 동작 속도)와 Memory Clock speed(VRAM 동작 속도)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*VRAM : GPU를 통해 처리되는 assets, textures, shadow maps등을 포함한 모든 Data를 저장합니다. DRAM, SSD, HDD에 비해 접근성이 좋고 빠릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Tensor cores?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Tensor cores란 NVIDIA에서 개발한 행렬 곱셈 프로세스를 가속하는 처리 장치 입니다. CUDA Cores가 1 Core Clock에 하나의 fp32 부동소수점 연산을 수행하는 것에 비해 Tensor Cores는 같은 Term 동안 4 x 4 크기의 fp16 행렬 두 개를 곱하고 그 결과를 4 x 4 fp32 행렬에 더하는 Matrix multiply-accumulate 연산(A와 B를 곱하고 C를 더하는 과정을 하나의 연산으로 수행)을 수행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;multiply-accumulate.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byxnv3/btrp7inNohN/3FHcwAAeI7mAs5J0aDZynk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byxnv3/btrp7inNohN/3FHcwAAeI7mAs5J0aDZynk/img.png&quot; data-alt=&quot;[Figure 3] Matrix Multiply-Accumulate 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byxnv3/btrp7inNohN/3FHcwAAeI7mAs5J0aDZynk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyxnv3%2Fbtrp7inNohN%2F3FHcwAAeI7mAs5J0aDZynk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;172&quot; data-filename=&quot;multiply-accumulate.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 3] Matrix Multiply-Accumulate 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 과정에서 fp16 행렬을 입력 받고 fp32 행렬을 출력하기 때문에 Mixed precision이라고 불립니다. 또한 이 연산은 Rounding이 한번 일 때 FMA(Fused Multiply-Add)라고 불리기도 합니다. 각 Tensor core는 한 번의 GPU Clock에 64개의 부동소수점 연산을 하는데 이는 출력 행렬의 한 원소를 계산하기 위해 4 개의 FMA 연산이 필요하고 총 4 x 4 (16개)의 원소가 존재하기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fma.png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv7peS/btrp7iBlt9d/fwJEFYk81ADQdn7sUiLtX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv7peS/btrp7iBlt9d/fwJEFYk81ADQdn7sUiLtX1/img.png&quot; data-alt=&quot;[Figure 4] FMA 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv7peS/btrp7iBlt9d/fwJEFYk81ADQdn7sUiLtX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv7peS%2Fbtrp7iBlt9d%2FfwJEFYk81ADQdn7sUiLtX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;593&quot; height=&quot;231&quot; data-filename=&quot;fma.png&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 4] FMA 연산&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Tensor Cores라는 이름에서 'Tensor' 의 의미는 무엇일까요? Tensor란 다차원의 Data sets 를 저장할 수 있는 컨테이너로 행렬의 확장으로 생각할 수 있습니다. 행렬은 숫자를 포함한 2차원 구조이지만 Tensor는 숫자의 다차원 집합으로 표현됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Tensor-Explained-1024x576.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u0gpF/btrp7RKgFbx/6noKN6Qt3Gd427ArMzZkg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u0gpF/btrp7RKgFbx/6noKN6Qt3Gd427ArMzZkg1/img.jpg&quot; data-alt=&quot;[Figure 5] Tensor&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u0gpF/btrp7RKgFbx/6noKN6Qt3Gd427ArMzZkg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu0gpF%2Fbtrp7RKgFbx%2F6noKN6Qt3Gd427ArMzZkg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;374&quot; data-filename=&quot;Tensor-Explained-1024x576.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 5] Tensor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;모든 마이크로 프로세서는 산술 및 논리 연산을 수행합니다. 이 중 중요도가 높은 산술 연산 중 하나는 바로 행렬 곱셈 입니다. 하지만 2개의 4 x 4 행렬의 곱셈을 수행하려면 이론적으로 64개의 곱셈 연산과 48개의 덧셈 연산이 필요합니다. 그렇기 때문에 NVIDIA는 연산의 정확도를 희생하여 더 많은 연산을 빠르게 수행할 수 있는 Tensor Cores를 세상에 출시하였습니다. NVIDIA의 Volta Architecture에서 이 기술이 최초로 적용되었으며 그 이후의 Architecture에도 이를 적용하여 훨씬 빠르게 연산을 수행할 수 있게 되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Turing-Tensor-Core-New-Diag-White-Background-1024x614.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G1oXA/btrp0LL9hWc/8vP261tEjNrkwqgsjyJFW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G1oXA/btrp0LL9hWc/8vP261tEjNrkwqgsjyJFW0/img.jpg&quot; data-alt=&quot;[Figure 6] Turing Tensor Cores (Int8, Int4 연산 추가)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G1oXA/btrp0LL9hWc/8vP261tEjNrkwqgsjyJFW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG1oXA%2Fbtrp0LL9hWc%2F8vP261tEjNrkwqgsjyJFW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;384&quot; data-filename=&quot;Turing-Tensor-Core-New-Diag-White-Background-1024x614.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Figure 6] Turing Tensor Cores (Int8, Int4 연산 추가)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Tensor Cores는 Clk 주기 당 여러 작업을 한 번에 수행할 수 있으며 CUDA Cores 보다 훨씬 높은 처리량(Throughput)을 수행합니다. 기계 학습 분야의 경우 비용과 계산 속도 면에서 Tensor Cores의 성능은 CUDA Cores를 크게 앞지르고 있으며 AI 연산 분야와 그 응용 분야들에서 널리 사용되고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;CUDA Toolkit에서 제공하는 라이브러리인 cuBLAS와 cuDNN에서는 Tensor Cores를 지원하고 있습니다. cuBLAS는 행렬과 행렬의 곱셈 연산인 GEMM 연산에 Tensor Cores를 이용하고 cuDNN 에서는 Convolution 연산에 이를 이용하고 있습니다. 실험 결과 Tensor Cores는 cuBLAS에서 4에서 9배, cuDNN에서 4에서 5배의 성능 향상을 이끌었습니다. Tensor Cores가 처음 적용된 Architecture인 Volta의 model 중 Titan V는 5120개의 CUDA Cores와 640개의 Tensor Cores를 갖고 있습니다. 하나의 Tensor Core 는 한 Cycle에 64개의 FMA를 수행하며 이는 한 번에 128개의 부동소수점 연산을 수행하는 것과 같습니다. 따라서 Titan V 의 경우 640개의 Tensor Cores가 있으므로 Cycle마다 128 x 640 개의 부동소수점 연산을 수행할 수 있습니다. Turing Architecture의 경우 딥러닝 추론 속도 향상을 위하여 INT8과 INT4 연산을 추가했는데 이를 통해 연산에 필요한 비트 수를 대폭 줄이고 연산 속도를 극적으로 향상시키는 Quantization 기법을 적용하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[1] &lt;a href=&quot;https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blogs.nvidia.com/blog/2009/12/16/whats-the-difference-between-a-cpu-and-a-gpu/&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[2] &lt;a href=&quot;https://www.techcenturion.com/nvidia-cuda-cores/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.techcenturion.com/nvidia-cuda-cores/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[3] &lt;a href=&quot;https://www.techcenturion.com/tensor-cores/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.techcenturion.com/tensor-cores/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;[4] &lt;a href=&quot;https://developer.nvidia.com/blog/programming-tensor-cores-cuda-9/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.nvidia.com/blog/programming-tensor-cores-cuda-9/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>GPU</category>
      <category>CUDA</category>
      <category>CUDA Cores</category>
      <category>GPU</category>
      <category>Tensor Cores</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/5</guid>
      <comments>https://comsys-pim.tistory.com/5#entry5comment</comments>
      <pubDate>Fri, 7 Jan 2022 19:48:35 +0900</pubDate>
    </item>
    <item>
      <title>[NVIDIA] NVIDIA에서 제공하는 AD 관련 DNN networks</title>
      <link>https://comsys-pim.tistory.com/4</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;경로 탐색 &lt;span&gt;DNN&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;=&amp;gt; &lt;/span&gt;&lt;span&gt;차량 주행 위치를 결정하고 전방의 주행 가능한 경로 계획&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1) OpenRoadNet : &lt;/span&gt;&lt;span&gt;차선 또는 인접 차선에 관계 없이 차량 주변의 모든 주행 가능 공간 식별&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2) PathNet : &lt;/span&gt;&lt;span&gt;차선 표시가 없는 경우에도 차량 전반의 주행 가능 경로 표시&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3) LaneNet : &lt;/span&gt;&lt;span&gt;차선과 차선 경로를 정의하는 다른 표식들 감지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4) MapNet : &lt;/span&gt;&lt;span&gt;차선과 고화질 지도를 업데이트하고 만드는데 사용할 수 있는 랜드마크 식별&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;객체 탐색 및 분류 &lt;span&gt;DNN&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;=&amp;gt; &lt;/span&gt;신호등과 도로 표지판&lt;span&gt;, &lt;/span&gt;잠재적인 장애물을 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1) DriveNet : &lt;/span&gt;도로의 다른 차량&lt;span&gt;, &lt;/span&gt;보행자&lt;span&gt;, &lt;/span&gt;신호등&lt;span&gt;, &lt;/span&gt;도로 표지판 인지 &lt;span&gt;(&lt;/span&gt;종류는 인지&lt;span&gt;X, &lt;/span&gt;종류만 인지&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2) LightNet : &lt;/span&gt;신호등의 상태를 빨간색&lt;span&gt;, &lt;/span&gt;노란색&lt;span&gt;, &lt;/span&gt;초록색으로 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3) SignNet : &lt;/span&gt;정지&lt;span&gt;, &lt;/span&gt;양보&lt;span&gt;, &lt;/span&gt;일방통행 등 신호의 종류를 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4) WaitNet : &lt;/span&gt;교차로같이 차량이 정지하고 기다려야 하는 장소의 상태 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;인지 능력 향상을 위한 &lt;span&gt;DNN&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;=&amp;gt; &lt;/span&gt;차량 부품과 조종석 상태를 감지하고 주차와 같은 조작을 용이하게 할 수 있도록 도움&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1) ClearSightNet : &lt;/span&gt;차량 카메라를 모니터링하여 비&lt;span&gt;, &lt;/span&gt;안개&lt;span&gt;, &lt;/span&gt;직사광선 같이 시야 제한 조건 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2) ParkNet : &lt;/span&gt;주차 가능한 장소를 식별&lt;/p&gt;</description>
      <category>Auto Driving project</category>
      <category>AutoDriving</category>
      <category>DNN</category>
      <category>nvidia</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/4</guid>
      <comments>https://comsys-pim.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 6 Jan 2022 17:15:06 +0900</pubDate>
    </item>
    <item>
      <title>[IEEE.2021] Deep Learning Inference Parallelization on Heterogeneous Processors with TensorRT</title>
      <link>https://comsys-pim.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;출처 : &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Jeong, Eun Jin, et al. &quot;Deep Learning Inference Parallelization on Heterogeneous Processors with TensorRT.&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;i&gt;IEEE Embedded Systems Letters&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(2021).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&amp;nbsp;본 논문은 향후 진행할 AD(Auto Driving) 프로젝트의 연구 방향에 대한 유관 연구 조사로 읽었기 때문에 방법에 대한 이야기는 빼고 문제 상황과 연구 방향 등에 초점을 맞춰 요약하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Abstract&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;: 임베디드 디바이스에서 Deep Learning Application의 사용이 증가함에 따라 디바이스는 CPU와 GPU 외에 NPU(Neural Processing units)라는 새로운 연산 unit을 도입하게 되었습니다. 빠르고 효과적으로 Deep Learning Application을 개발하기 위하여 NVIDIA에서는 NVIDIA Hardware platform에서 구동되는 '*&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;TensorRT&lt;/span&gt;'라는 *&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;SDK&lt;/span&gt;(Software Development Kit)를 제공합니다. 하지만 현재 TensorRT를 포함한 대부분의 Deep Learning Framework는 Deep Learning Inference(추론)을 위해 Single proccessor만 사용하고 있습니다. (GPU와 NPU를 동시에 사용하지 않음.) 하여 이 paper를 통해, 추론에서 최상의 Throughput을 내기 위한 새로운 방법을 제시합니다. : TensorRT상에서 하나의 Deep Learning App을 구동할 때, GPU와 NPU를 Parallelization methology를 사용하여 동시에 추론하는 방법을 새롭게 도입해 실험을 진행했고, 실험 결과 81% 에서 391% 가량의 성능 향상 결과를 확인할 수 있었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;*TensorRT : 학습이 완료된 Deep Learning model을 최적화하여 NVIDIA GPU 상에서 추론 속도를 향상(수 ~ 수십 배)시키는 모델 최적화 엔진 (딥러닝 추론 가속 엔진)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;*SDK : Software Development kit로 API를 포괄하는 개념입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;: 임베디드 디바이스에서 DL(Deep Learning) inference application의 사용이 증가하며 많은 임베디드 디바이스들은 추가적인 Hardware resource들을 장착하기 시작했습니다. 예를 들어 본 논문에서 사용할 NVIDIA의 Jetson AGX Xavier는 multi-core CPU와 GPU 외에 추가적인 하드웨어 리소스인 deep learning accelerators(*&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;DLAs&lt;/span&gt;)를 장착하고 있습니다. 본 논문에서는 학습이 완료된 network를 임베디드 디바이스에서 실행하기 위하여 TensorRT로 불리는 SDK를 사용합니다. 지금까지의 많은 연구들은 DL applications를 가속하기 위하여 software optimization을 사용해왔습니다. (예를 들어 quantization, low-rank approximation, layer fusion 등이 있으며, 이 중 몇몇의 최적화 기법들은 TesorRT에 적용되었습니다.) 이번 연구에서는 DL application의 throughput을 최대로 올리기 위하여 *&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;network-level optimization&lt;/span&gt;을 진행합니다. 해당 기법은 Hardware platform과 Objective function에 의존적이며 이와 관련한 많은 연구들이 있었습니다. 앞 줄의 내용을 설명하기 위해 본 논문에서 인용된 다른 논문들은 아래와 같습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[2] : multicore cpu의 자원을 최대로 활용하기 위한 방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[3] : Heterogeneous cpu core에서 Throughput을 증가시키기 위한 방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[4] : Mobile platform에서 GPU를 사용해 Single execution을 가속하기 위한 방법 (Deep X)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[5] : &lt;span style=&quot;background-color: #ffffff; color: #222222;&quot;&gt;Mobile platform에서 GPU를 사용해 Single execution을 가속하기 위한 방법 (CNNdroid)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[6] : CPU/GPU Pipelining으로 Throughput 향상시키는 방법 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (pre/post 기법으로 GPU에서 network body 실행되는 동안 cpu로 task 처리)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[7] : multiple deep neural networks (DNNs)을 CPU-GPU heterogeneous system에서 실행하여 Throughput 증가&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[8] : multiprocessor system에서 conventional parallel scheduling을 통해 CNN model을 dataflow graph로 변환&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[9] : 각 network가 single PE에 매핑되었다 가정했을 때 multiple DNN instances를 scheduling하는 방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;[10] : multiple DNN instances가 GPU와 NPU를 포함한 Heterogeneous system에서 구동될 때 각 network에 task-level parallelism을 적용해 Throughput을 증가시키는 방법 (그러나 single DL applicarion에서 GPU와 NPU를 동시에 지원하는 SDK가 존재하지 않는 한계가 있습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;하여, 본 논문에서는 single DNN application의 throughput을 최대치로 올리기 위하여 TensorRT를 기반으로 한 parallelization 기법을 제시합니다. (GPU와 NPU를 동시에 사용할 수 있도록) 최종적으로 GPU와 NPU를 동시에 사용해 두 network instances를 concurrently하게 실행하여 Heterogeneous processors의 사용성을 향상시킬 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*DLA : Deep learning accelerators로 neural porcessing units(NPUs)라고 불리기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*network-level optimization : 본 논문에서 제시하는 개념으로, task-level parallelism과 pipelining을 포함한 다양한 레벨에서의 Parallelism 기법입니다. 이 기법은 하드웨어 플랫폼과 objective function에 큰 영향을 받습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Conclusion&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;: 여섯 개의 real-life benchmark를 사용하여 성능을 측정한 결과 81%에서 391% 가량의 성능 향상을 확인할 수 있었습니다. 기존까지 임베디드 디바이스에서 pipelining과 multi-threading의 parallelism이 적용된 연구는 거의 없거나 존재하지 않았습니다. 이번 연구가 특정 하드웨어 플랫폼(Jetson)을 통한 검증 결과이긴 하지만 다른 Platform에도 확장 가능할 것이라 판단하며, 유용한 결론을 도출했다고 생각합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Auto Driving project/관련 논문</category>
      <category>DL Inference</category>
      <category>Embedded device</category>
      <category>heterogeneous</category>
      <category>Jetson</category>
      <category>TensorRT</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/3</guid>
      <comments>https://comsys-pim.tistory.com/3#entry3comment</comments>
      <pubDate>Wed, 5 Jan 2022 14:59:39 +0900</pubDate>
    </item>
    <item>
      <title>소개</title>
      <link>https://comsys-pim.tistory.com/2</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mannequin-g8175b0f2f_1920.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uQwyR/btrpYnwS6aj/UdtLeS3gDfS6vVHVCuZGK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uQwyR/btrpYnwS6aj/UdtLeS3gDfS6vVHVCuZGK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uQwyR/btrpYnwS6aj/UdtLeS3gDfS6vVHVCuZGK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuQwyR%2FbtrpYnwS6aj%2FUdtLeS3gDfS6vVHVCuZGK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1343&quot; data-filename=&quot;mannequin-g8175b0f2f_1920.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jihak.lee Notion Link : &lt;a href=&quot;https://gigantic-radio-6d0.notion.site/Profile-0c4a2f2c3f254ae08e2f4b335835e118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gigantic-radio-6d0.notion.site/Profile-0c4a2f2c3f254ae08e2f4b335835e118&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 제 블로그에 방문하신 모든 분들 환영합니다 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 현재 성균관대학교 전자전기공학부에 학사로 재학중이며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Computer Science &amp;amp; System Software 관련 Lab에서 프로젝트를 진행 중에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연구와 프로젝트를 하며 공부하는 내용을 기록하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 사람들과 공유하고 싶다는 생각이 들어 블로그를 열게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부족한 점이 많겠지만 서로 소통하며 함께 성장하는 기회가 되었으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 관심 분야는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#PIM #GPU #Auto_Driving #CUDA #AI_Hardware #AI_Accelerator #FPGA #Jetson #DNN&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그에는 연구 분야 관련 내용과 개인적인 공부 관련 (영어 회화?) 포스팅을 할 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Introduction</category>
      <author>H/W engineer_ beginner</author>
      <guid isPermaLink="true">https://comsys-pim.tistory.com/2</guid>
      <comments>https://comsys-pim.tistory.com/2#entry2comment</comments>
      <pubDate>Mon, 3 Jan 2022 16:34:51 +0900</pubDate>
    </item>
  </channel>
</rss>