2015의 게시물 표시

JBL Flip2 Charging issue. replace micro usb(b)

이미지
JBL Flp2 이쁘게 생기고, 음질도 좋다. 문제는 국내 정식수입업체도 AS가 되지 않는다.(AS를 보내면 교환이 원칙이라며 10만원에 가까운 돈을 요구한다.)   문제 Flip2의 충전단자가 접촉불량인듯 충전이 되질 않는다. 구글링 해보면 충전단자를 케이브롤 뽑아낸 자료가 있었다.( https://www.youtube.com/watch?v=-VNsuGodUkk )  개인적으로 이런건 별로 좋아하지 않아서 분해하였다.   허... 충전 단자가 실리콘으로 떡칠이 되어있다. 자세히보면 충전단자도 피스로 고정이 되어있기 때문에 저렇게 떡칠할 필요가 없을것 같은데, JBL측에서도 문제가 있다는걸 알고 있었던것 같다. 칼로 조심해서 실리콘을 잘라내고 usb 단자를 분리 하였다.  자세히 보면 usb 커넥터가 기판에서 떨어져 있다. 부품이 불량 같다. 저런부품은 엘레파츠에서 비슷한 것들이 많아서 구매하였다. 아래쪽에 micro usb 커넥터 이다. 혹시 몰라 케이블에서 커넥터를 빼서 쓸까해서 같이 구매하였다. 원래 파워케이블을 잘라서 납땜해주고 연결하였다. 잘 동작한다. 사진은 없지만, 새로산 micro usb 커넉터의 보드가 조금 더 커서 플라스틱 케이스를 잘라내었다. 제일 힘들 부분이었다. 딱 맞추어 잘라내는데 2시간 정도 걸린것 같다. 정확히 맞추어 준 후 실리콘으로 떡칠 해주었다. 잘 굳었는지 확인하고 다시 조립. 다 조립후 잘 되는지 한번더 확인. 부품 구매에 1만원도 쓰지 않았다. 뿌듯함. ㅋㅋ

OpenCL Vector type 간 비교

OpenCL에는 벡터 형 자료가 있다. 아래 표는  https://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ 에서 긁어왔다. Type in OpenCL Language Description API type for application char n A vector of  n  8-bit signed two's complement integer values. cl_char n uchar n A vector of  n  8-bit unsigned integer values. cl_uchar n short n A vector of  n  16-bit signed two's complement  integer values. cl_short n ushort n A vector of  n  16-bit unsigned integer values. cl_ushort n int n A vector of  n  32-bit signed two's complement integer values. cl_int n uint n A vector of  n  32-bit unsigned integer values. cl_uint n long n A vector of  n  64-bit signed two's complement  integer values. cl_long n ulong n A vector of  n  64-bit unsigned integer values. cl_ulong n float n A vector of  n  32-bit floating-point values. cl_float n double n A vector of  n  64-bit floating-point values. cl_double n 정말 편한게 벡터간에 연산이 가능하고  실제로 HW에서 벡터연산을 지원하는 경우가 많으므로 벡터연산을 하면 성능이 향상된다. 벡터간

OpenCL 워크 그룹 사이즈 결정(How to determine work group size on OpenCL)

OpenCL을 사용하여 워크그룹 사이즈(CUDA에서는 Dimension, block, thread)를 결정해야 할때 Global workgorup size 는 해결하고자 하는 총 문제수를 커버 해야한다.  즉, 1024 x 1024 행렬이 있다면 커맨드큐에 NDRagneKernel을 할때 global workgroup size는 1024 x 1024 = 1048576 이 된다. Local workgorup size를 NULL 로 입력해주면 OpenCL이 알아서 실행하여 준다. 하지만 성능향상을 위해서는 local workgorup size를 수동으로 넣어주어야 할때가 있다. 연산장치(GPU 또는 기타장치)의 프로필을 보면 Max work group size 정보를 알 수 있다. 예를 들어 Max work group size 가 256 이었다면 local work group size는 모든 Dimenstion을 곱했을때 256 보다 같거나 작아야 한다. 저 256이라는 숫자는 보통 FrontWave(CUDA에서는 WARP) 에 의해서 결정되는데 Hardware 적으로 context switching 할 수 있는 총 그룹수와 PE( processing element ) 수에 의해 결정된다. PE가 64개 이고 FraoneWawe가 4이면 256이기 때문에 local workgorup 에서 처리할수 있는 work item 갯수는 256개가 된다. 총연산 유닛(compute unit)이 32개 라면 64(PE)*32(CU) = 2048 개가 동시에 처리되고 2048*4 = 8192 개 의 work-item이 스위칭되면서 실행된다.  이때 work-item들이 메모리에 동시에 접근할때 대역폭 정보 등까지 고려되어야 성능 향상에 대한 이해와 최적화를 할 수 있다.

Data dependence

Data dependence Flow Dependence(True dependence) Anti Dependence Output Dependence Flow Dependence(True dependence) 어떤코드 S1이 메모리 영역에 쓰고난 다음 어떤코드S2가 해당 위치를 읽음 S1과 S2는 동시에 실행하거나 순서를 바꿀수 없음 Anti Dependence 어떤코드 S1이 메모리 영역에서 읽고 , 그다음 어떤코드 S2가 해당 영역에 씀 S1과 S2는 동시에 실행하거나 순서를 바꿀수 없으나 S2코드를 수정하여 dependence를 제거할 수 있음 Output Dependence 어떤코드 S1이 메모리 영역에 쓰고, 그다음 어떤코드 S2가 해당 영역을 읽음 Anti Dependence와 마찬가지로 순서를 바꿀수 없으나 코드 수정으로 dependence 제거 가능 루프 캐리드 디펜던스(Loop-carried dependence) 루프 안에서 이전 이터레이션과 다음 이터레이션에 dependence가 존재 이터레이션들을 각각 동시에 실행 불가능 루프 인디펜던트 디펜던스(Loop-independent depecdence) 루프 안에 있으나 루프와 무관하게 루프안 코드들이 depecdence가 존재(Flow, anti, output 이 loop안에 있으면 loop-independent depecdence라고 하는것 같음)

C pointer #2 ( 2 Dimension, 3 Demension pointer )

int *i; int형 자료를 가르키는 포인터 i double (*a)[SIZE]; double이 SIZE개 있는 배열을 가르키는 포인터 a a++ 를 실행하면 a의 주소크기가 SIZE*8만큼 증가한다. a = (double (*)[SIZE])malloc(sizeof(double) * SIZE * SIZE); cast는 위와 같이 한다. 그럼 3차원은? double (*a)[SIZE][SIZE] = (double (*)[SIZE][SIZE]) malloc(sizeof(double) * SIZE * SIZE );

C pointer

int *(*func)(int *(*)(int *, char *), int **(*)(int **, char) ); int 포인터를 반환하는 func라는 함수 포인터 선언 이 함수의 인자 형식은 2개의 함수 포인터를 받음 첫번째 함수포인터는 int포인터를 return하고 인자로 int 포인터와 char 포인터를 받음 두번째 함수포인터는 int 2중포인터를 반환하고 인자로 이중 int포인터와 char 를 받음 질문은 댓글로 ㅎㅎ

64bit buffer overflow example

env: kili 64bit vmware #include <stdio.h> #include <string.h> int foo(char * arg0){         char tmp[10];         strcpy(tmp, arg0); printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");         printf("tmp add 0x%08x \n",tmp);         return 0; } int bar(void){         printf("bar \n"); } int main(int argc, char *argv[]){         printf("foo add : 0x%08x \n", foo);         printf("bar add : 0x%08x \n", bar);         foo(argv[1]); } ======================================= a.out $(python -c 'print "A"*18+"B"*6+"\x40\x05\xa5"[::-1]')

Frist OpenCL example on Windows

이제 OpenCL 예제 프로그램을 작성하여 보자. 작성하기전 알아야 될 개념은 OpenCL은 가용한 자원들의 집합이 추상화된 platform 과 platform안에 연산유닛이 추상화된 device 라는 개념이 있다. 가용한 platform은 OpenCL에서 사용할수 있도록 알맞은 드라이버가 설치되어 있어야한다. NVidia 그래픽 카드의 경우 CUDA를 설치하면 드라이버가 설치된다. Intel CPU의 경우는 intel opencl 로 구글링하면 " Intel Developer zone " 이 리스팅되는데 이곳( https://software.intel.com/en-us/articles/opencl-drivers )에서 본인에게 알맞은 드라이버를 다운로드 하면 CPU자원을 이용할 수 있다. 실제 C로 작성되는 프로그램은 host 라고 부르며, 병렬로 처리되는 함수를 kernel 이라고 한다. kernel은 C언어에 OpenCL의 예약어를 이용하여 작성할 수 있다. 성격 급하니 이론보다 코딩부터 해보자. 먼저 내가 사용할 수 있는 연산자원이 얼마나 있는지 확인하여 보자. (예제 프로그램은 구글링한 결과를 참고하여 작성하였다. - 출처불명) host 프로그램 예제(getinfo.c) #include <stdio.h> #include <stdlib.h> #include <CL/cl.h> int main() { unsigned int i, j; //플랫폼을 가져오기 위한 배열(실제로는 포인터사용후 메모리 할당 해야함) cl_platform_id platforms[32]; // 플랫폼의 갯수를 저장하기위한 변수 cl_uint num_platforms; // 벤더이름. 1024바이트를 넘지 않았으면 한다. char vendor[1024]; //디바이스를 가져오기 위한 배열(

Starting OpenCL with MinGW on Windows

이종병렬 프로그래밍에 사용되는 OpenCL 윈도우OS에서 컴파일/실행하기 위해서는  1. NVidia 홈페이지의 CUDA 존에서 툴킷을 다운로드 한다. Windows 8 64비트 용 파일이름은 cuda_6.5.14_windows_notebook_64 이다. 설치는 간단하다. 다음다음 하면 설치된다. 2. 컴파일 하기 위한 환경을 구성해야한다. 윈도우의 경우 VisualStudio Express, MinGW, cygwin 을 이용할 수 있다.  여기서는 MinGW를 설치하였다.(MinGW와 cygwin 의 차이점은 linux환경을 완벽하게 호환되게하는지 안하는지이다.)  MinGW를 검색해서 MinGW installer 설치후 msys, 컴파일러 등 선택하여 설치한다. 설치는 가급적 c: 드라이브 아래 MinGW 폴더로 하길 권장한다. program files 같은곳은 빈칸 때문에 사용할때 불편을 겪을수 있다. 설치가 끝나면 MinGW아래 msys 아래 버전폴더가 있다. 그 속에 보면 msys 배치파일이 있는데 실행하기전 MinGW의 위치를 마운트해주어야 한다. etc 아래 fstab 파일(없으면 생성한다)안에 아래와 같이 적어준다. C:\MinGW   /mingw 배치파일을 실행하여 컴파일러가 동작하는 확인한다. 3. 이제 OpenCL 예제 프로그램을 작성하여 실행해보자