저렴한 인공지능 바둑(릴라제로)용 GPU/CPU 성능비교


 중고로 매우 저렴하게 구할 수 있거나 구형인 GPU 및 몇몇 CPU 들로 릴라제로를 돌려본 결과를 올려봄.
 // 2019.07.23 - i5 4670과 GTX1070TI의 벤치 결과를 추가함


* 사용한 버전
   (버전과 뉴럴넷 사이즈에 따른 편차가 매우 큰 것으로 보임. 비교시 동일 버전으로 비교해야 함)
  - 릴라제로 버전 : 0.17
  - 뉴럴넷 weight파일 : a20c31da (256x40)

* 벤치 방법
  - [leelaz.exe -w weight.gz --benchmark]를 옵션으로 하여 실행 => n/s 값 사용
  - [leelaz.exe -w weight.gz --tune-only]를 옵션으로 하여 실행 => GFLOPS 값 사용(GPU가속시)
     // 필요시 leelaz_opencl_tuning 파일 제거

* CPU 결과 (--cpu-only 옵션 사용)
  - Intel i3 2120 @3.3GHz : 4 n/s
  - AMD Phenom II 1055T X6 @2.8GHz : 5 n/s
  - Intel Xeon 1265L V2 @3.1GHz : 8 n/s
  - Intel i7 2600k @4.3GHz(OC) : 10 n/s
  - Intel i5 4670 : 10n/s

* GPU 결과
  - GTX660 : 51n/s (645 GFLOPS)
     // 기본 옵션, 위 AMD Phenom으로 테스트
  - GT1030 : 75n/s (683 GFLOPS)
     // 기본 옵션, 위 Xeon으로 테스트
  - RX570 @1200MHz : 220n/s (2826 GFLOPS)
     // [--batchsize 10 -t 30 --precision single] 옵션을 추가로 사용함
         (실제 Sabaki 등에도 해당 옵션 추가해 사용해야 성능 편익 얻을 수 있음)
     // 위 i3 2120과 위 i7 2600k로 각각 테스트
         (두 시스템간 GPU 가속 성능 측정 결과 차이는 거의 없음)
  - GTX1070ti : 450n/s (5290GFLOPS)
      // [--batchsize 30 -t 30] 옵션을 추가로 사용함
  - GTX1070ti dual (no SLI) : 370n/s 
      (듀얼인데도, --gpu 1 옵션을 주어서 single로 측정한 위 450n/s 결과보다 더 느리게 나옴)

-------------------------

 대체적으로 CPU보다 GPU가 엄청난 격차를 내며 좋은 성능을 보였음. 200 visit 정도로 세팅할 경우 RX570에서는 1초만에 착수가 이루어짐.

 RX570의 경우 이론 속도는 Half Precision과 Single Precision이 동일해야 하고, 메모리 대역폭에 있어 Half Precision이 유리해야 하지만, 실제 벤치마크 결과로는 Single Precision으로 실행하는 것이 근소하게 빠른 것으로 나타남. (별도로 옵션을 주지 않을 경우 RX570에서는 Half Precision으로 실행됨)
 RX570은 2019년 6월 현재 중고로 5.5만 정도에 구할 수 있어 저렴하게 바둑용 PC를 꾸미는데 적합해 보임

 GTX660과 GTX1030은 릴라제로 튜닝시 계산되는 GFLOPS값은 비슷하지만, 실제 바둑 연산에 사용되는 n/s 수치는 1.5배 가량 차이를 보임 (AMD 시스템으로 인한 것인지, 아키텍쳐간 효율 차이인지 불분명함)

 GTX1070Ti는 RX570의 2배를 조금 넘는 성능으로 측정됨.
 특이하게, GTX1070Ti는 dual로 동작시킬 경우 더 느린 결과를 보여줌. (작업관리자의 CUDA 항목 모니터링으로 각각 세팅한 개수(1개,2개)의 GPU가 동작하는 것을 확인하였음) 
 1070TI의 중고가는 2019년 7월 현재 30만원 정도임.

---------------------------

 라이젠 2400G에 내장된 VEGA 11의 경우 Half Precision으로 돌릴 경우 이론 성능이 3,492GFLOPS로, RX570의 이론 성능의 70% 정도임. 20% 정도 오버클럭이 어렵지 않고, PCI-E를 통한 데이터 이동이 없는 점 등을 고려하면 의외로 괜찮은 성능이 나오지 않을까 예상.

 GTX1060(3GB)는 벤치마크하지 못했으나, GT1030을 그대로 스케일링할 경우 240n/s로 계산됨.

by openwrld | 2019/06/12 01:11 | 컴퓨터하드웨어 | 트랙백

윈도우7 메모리 부족 메시지 관련.

 실제 사용하는 메모리는 많지 않은 것 같은데, 계속 메모리 부족 메시지가 나올 경우 조치 방법.

 

---------------

 현상은 다음과 같음. (메모리 부족 및 확보 불가)


1. 메모리 부족 메시지가 뜸 

2. 작업관리자 성능 탭에서 실제 메모리 부분의 "여유" 항목이 매우 작으며, "캐시됨"항목이 매우 큼

3. 작업관리자 등으로 확인했을 때 각 프로세스에서 직접적으로 사용하는 메모리는 많지 않은 것으로 나옴

4. RAMMAP 등의 유틸리티를 이용하여 확인했을 때 Modified 부분이 매우 많이 잡혀 있으며, Empty standby list를 실행해도 확보되는 메모리량이 많지 않음 (정상적일 경우 Empty standby list를 실행하면 작업관리자의 "캐시됨" 항목이 거의 대부분 반환되어 "여유" 항목으로 이동해야 함)



-----------------



 위와 같은 상황으로 메모리 확보가 불가할 경우, 다음과 같은 방법으로 해결



 1. 작업관리자의 "프로세스" 탭에서 "보기(V) - 열 선택(S)" 선택

   


 2. "핸들" 선택

   


 3. 추가된 "핸들"열로 소팅(해당 열 제목 클릭)하여 비정상적으로 숫자가 높은 항목 찾아 제거 (언인스톨 혹은 프로세스 중지)
    (문제가 있을 경우 10000단위로 나타날 것임)
   



-----------


 내 경우에는 "Rexpert30 print service"가 3GB 가량을 잡아 먹고 있었음. (제거 하여 메모리 확보 확인)

by openwrld | 2018/07/09 11:02 | 트랙백

Coocox IDE에서 nano C Library 사용하기

 Coocox IDE 1.7.8 (현재 2.0을 제외하고 최종버전)에서 nano C library를 사용하는 방법.

 링킹시에 사용하는 C library를 무엇을 선택하느냐에 따라 최종 컴파일된 바이너리의 용량이 결정되므로, 용량이 매우 작은 저가형의 cortex-m0 계열 프로세서 사용시에는 용량이 작은 라이브러리를 선택하는 것이 매우 유리하다.
 STM32F030F4 같은 경우 16KB의 코드메모리(플래쉬)를 제공하는데, 실제로 코딩하다 보면 생각보다 빨리 줄어들어, 데이터 메모리는 오히려 충분한데 반해 코드 메모리에 허덕이는 예상치 못한 상황이 발생할 수 있다. 코드를 최적화하다 못해 결국 기능을 줄이는 상황까지 가게 되는데, 이럴 때 불필요하게 코드 메모리를 사용하는 라이브러리를 다이어트하면 추가적인 코드 메모리 확보가 가능하다.

1. gcc-arm은 4.7 이상을 설치
2. coide 1.7.8 설치
3. coide 설치폴더 하단의 plugins 폴더에 첨부된 파일 (org.coocox.utils_1.0.0.201410211009.jar)을 오버라이트
4. coide에서 toolchain(gcc-arm)의 위치를 다시 설정

 LTO(Link Time Optimization)까지 사용하면 유저가 작성한 c 파일에서 사용하지 않는 펑션까지 제거해주므로 코드 메모리를 더더욱 아낄 수 있다.

 관련글 : http://openwrld.egloos.com/4386957  (nano lib 사용하며 발생할 수 있는 메모리 align 버그 관련)

by openwrld | 2015/07/07 23:50 | Java/C | 트랙백

Coocox IDE의 _sidata alignment 버그

 ARM 계열의 무료 IDE인 Coocox IDE를 사용하던 중 버그를 발견..!!

 이건 CoIDE의 버그일 수도 있고, 애초에 ARM-GCC의 링커의 버그일 수도 있는데.. 일단 포스트 한다.


 현재 CoIDE의 버전은 1.7.8과 2.0.0베타 두가지 이며, 두가지 모두 동일한 현상을 보임.

 base C library를 사용하면 펌웨어가 문제 없이 동작하지만, nano C library를 사용하도록 세팅하면 펌웨어가 동작하지 못하고 hard fault가 걸리는 현상이 주된 현상이 될 듯 하다.

 


 위는 컴파일, 링크 후 생성된 map 파일의 내용이다. 우측에 표시되는 링커 스크립트에 의하면 _sidata의 주소는 0x080042d0가 되어야 하나, 1이 작은 0x080042cf가 되어 있다.
 _sidata는 변수들의 초기값이 저장된 플래쉬 메모리상의 주소를 나타내는데, 이 위치가 위 스크립트로는 text(코드)가 끝난 부분에 이어서 붙도록 되어 있다. 펌웨어에서는 main()함수에 진입하기 전에 램에 위치한 변수값의 초기화를 행하는데, 이 변수값의 초기값은 당연히 플래쉬 메모리에 저장되어 있고, 이것을 복사하기 위한 코드가 펌웨어에 포함되며, 이 초기화 코드에 플래쉬 메모리 상의 데이터의 위치를 지정해주는 값이 바로 저 _sidata 심볼이다.

 문제는, 저 위치가 4바이트 정렬이 되지 않으면서 발생하는데, 저 값이 4바이트 정렬이 되어있지 않을 경우 메모리 복사시에 hard fault가 발생해버린다. (펌웨어의 main() 함수가 시작하지 조차 못한다.) 아마도 ARM 코어나 AMBA 버스의 특성상 해당 문제가 발생하지 않나 하는 생각이다.

 이에 대해 조금 더 찾아보면, ARM-GCC에 포함된 예제 링커 스크립트, 혹은 Coocox에 포함된 예제 링크 스크립트에는 모두 저 위치를 4바이트 align 시키기 위한 구문이 포함되어 있다.

 위는 C:\CooCox\CoIDE\Library\BuildTempFile\ARM GCC\link.ld 의 내용의 일부이며, sidata에 현재 주소를 넣기 전에 align 시키는 구문이 포함되어 있다.


 
 위는 CoIDE가 자동으로 생성시키는 링크 스크립트이며, 이처럼 CoIDE가 생성시키는 링크 스크립트에는 해당 내용이 포함되어 있지 않다.
 (명시적으로 align 시키지 않을 경우 __etext와 _sidata의 값이 다르게 나타나는데, 이 원인은 알 수 없다. __etext는 특별히 처리해주는 예약어인지도? )


 거의 대부분의 경우 위처럼 명시적 align을 하지 않아도 sidata가 4바이트 정렬된 상태인 경우가 많아 일반적으로는 문제가 생기지 않는 경우가 많다. 하지만, 용량이 더 작아 많은 메모리를 아낄 수 있는 nano C library를 사용하도록 세팅할 경우 4바이트 정렬이 틀어지는 경우가 종종 발생하는 것으로 보인다. (경우에 따라 문제가 되기도 하고 되지 않기도 한다)


 이를 해결하는 방법은 CoIDE가 자동으로 생성하는 링크 스크립트를 사용하지 않고 직접 링커 스크립트를 지정하여 사용하는 방법인데, 다음과 같은 절차가 필요하다.

 먼저 저 부분을 uncheck하면 펌웨어가 위치한 폴더에 arm-gcc-link.ld 파일이 생성된다. (이 .ld 파일은 configuration의 scatter file에 자동으로 지정되어 있다)

 해당 .ld 파일을 열어 ". = ALIGN(4);"를 "__etext = .;" 바로 이전에 넣어주면 된다. (위 ARM-GCC의 링커 파일 참조)


 링커가 스크립트의 표현, 예상과 조금 다르게 동작하는 것이 1차적인 원인일 수 있고, CoIDE의 링커 스크립트 생성부분에도 문제가 있어 보인다.


by openwrld | 2015/05/08 15:51 | Java/C | 트랙백 | 핑백(1)

사운드폰트를 사용하는 고음질 가상미디 생성하기

 이 내용에 관해서는 이전에 http://openwrld.egloos.com/3594349 에서 한번 다룬 적이 있으나, 이보다 나은 방법이 있어 적어보고자 함.
 하지만 그냥 미디 파일 감상용이라면 여전히 xmplay에 midi plugin을 올려 사용하는 것이 가장 간편한 방법임!
 ( xmplay : http://support.xmplay.com/files_view.php?file_id=653  /  midi plugin : http://support.xmplay.com/files_view.php?file_id=500  // 링크는 버전에 따라 변경될 수 있으므로 주의 )


 준비물은..

1. loopMIDI : 가상미디 설치용. 가상 미디 디바이스를 만들고, 출력되는 미디 신호를 다시 내부의 가상 입력으로 돌려주는 역할을 함.
   - 파일 : loopMIDI_1_0_5_15.zip

2. BMSynth : 미디신호를 받아 사운드폰트로 소리를 만들어 출력하는 프로그램
   - 파일 : BMSynth168Setup.zip

3. 사운드폰트
   - 여타 사운드폰트 구글링!

4. 기타 미디 출력용 프로그램 (윈앰프, 미디 지원 게임 등) 
    : Dosbox를 이용하여 고전 프로그램의 출력을 soundfont로 출력하는 것도 가능함!


 BMSynth는 음장 효과가 훌륭하고, 사운드폰트를 이용한 재생 자체도 상당히 정확/정밀한 장점이 있음. 다만 단점은, 디바이스와 연결된 볼륨조절 인터페이스가 없어 (플레이어에서 직접 볼륨조절이 되지 않고) BMSynth 창을 띄워놓고 해당 창에서 볼륨을 조절해야 함. (윈도우7이라면 믹서에서 BMSynth의 볼륨을 조절하는 식의 방법도 사용 가능)




1. loopMIDI 설치

  - 설치 후 기본으로 1개의 가상 디바이스가 설치되어 있음
  - 이 디바이스로 출력하는 미디신호는 다시 이 디바이스의 입력으로 들어오는 가상미디임. BMSynth는 이 다시 돌아오는 미디 신호를 받아 소리를 만들어 출력해주는 역할을 함




2. BMSynth 설치

  - 장치 변경 -> loopMIDI로 설정
  - 사운드폰트 변경 -> 다운받아놓은 사운드폰트 지정
  - 다른 설정도 취향에 따라 변경 가능하나, 기본 설정으로도 충분히 훌륭한 소리를 들려줌



3. 미디 출력 프로그램 설정 및 감상!

  - 여기에서는 윈앰프를 사용 (여타 게임이나 각종 프로그램 사용 가능)
  - 출력 미디장치를 loopMIDI로 변경해 줌




 이제 미디 소리를 들을 수 있음..

 사운드폰트를 다운받았다면, 데모 미디 파일이 동봉되어 있으므로 그것으로 테스트를 해봐도 좋을 것임!

 데모 : 워크래프트2 BGM 미디파일 중 팔라딘의 테마

 미디원본파일 : 381.mid
 미디녹음파일 : 381.wma



by openwrld | 2014/11/02 00:40 | 컴퓨터하드웨어 | 트랙백

◀ 이전 페이지          다음 페이지 ▶