'팁?'에 해당되는 글 7건

  1. 2014.09.15 x86 vs ARM
  2. 2014.09.15 simulator vs emulator
  3. 2013.07.27 parameter(매개변수), argument(인자)
  4. 2013.07.19 자잘한
  5. 2013.07.16 dp돌릴때
  6. 2013.07.13 dfs할때
  7. 2013.07.08 최대값, 최소값 구하는법

x86 vs ARM

팁? 2014. 9. 15. 15:05


인텔의 x86은 CISC로 시작하여 명령어셋이 복잡하고 가변길이지만, ARM은 RISC로 시작하여 명령어셋이 단순하고 고정길이를 갖고 있습니다.
그래서 인텔x86은 명령어셋이 복잡하고 가변길이인탓에 명령어를 해석하고 Decoding Unit에 집적되는 트랜지스터가 많을 수 밖에 없고,
상대적으로 ARM은 Decoding Unit에 집적되는 트랜지스터가 적습니다. 그런 점에서 소비전력상 ARM이 유리한 것으로 알고 있습니다.


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



이미 ARM은 임베디드 분야를 꽉 잡고 있었기 때문입니다. 스마트폰이 유행이기에 조금 더 '일반 사용자'의 눈 안에 들어온 것일 뿐 ARM은 ARM입니다.
ARM 아키텍처의 장점은 임베디드 분야를 전제로 '최대한 간소화한' 아키텍처라는 점입니다. 즉, 군더더기가 없습니다. 군더더기가 없기에 전력 소비량과 발열에
심각하게 민감한 임베디드 분야에서 최적의 성능과 최적의 전력 소비량을 갖게 됩니다.

또한 ARM은 아키텍처를 만들 뿐 나머지 부분의 추가나 최적화는 개별 반도체 제조사의 영역으로 맡기고 있기에 용도에 따른 다양한 제품군을 만날 수 있습니다.
라이선스 계약을 맺는 것도 어렵지 않기에 사업 참여가 쉽습니다. x86은 라이선스 정책이 너무나 복잡해 만들 수 있는 제조사가 너무나 적습니다. 그러다보니
틈새시장을 공략한 제품을 만들기도 쉽지 않습니다. x86이라는 것은 규모의 경제가 되지 않으면 소화해내기 어려운 아키텍처입니다.

하지만 ARM이 만능의 아키텍처라서 x86을 잡아먹을 가능성은... 사실상 0에 가깝습니다. ARM 아키텍처는 워낙 간소화에 초점을 맞췄기에 반대로 성능 향상에
제한을 받습니다. 임베디드 영역 안에서라면 어떻게든 성능을 계속 올릴 수 있지만, 제대로 된 데스크탑 및 노트북 컴퓨터나 서버 시장을 잡아 먹을 수 있는
성능을 내지 못합니다. 이렇게 하려면 결국 x86과 비슷할 정도의 전력 소비량을 갖지 않으면 안됩니다. 그것이 ARM이 노리는 것일까요? 결코 아닙니다.

x86은 CISC에서 출발은 했지만 지금의 구조도 CISC이며 RISC와 다르다고 할 수 없습니다. 오히려 지금 세대의 x86은 RISC의 매우 많은 부분을 받아들인 복합 구조입니다.
또한 RISC라고 해도 Power6나 Power7같은 아키텍처는 상상을 초월(?)하는 전력 소비량을 자랑합니다. 물론 성능도 상상을 초월합니다만, 성능을 높이려면 
어느 정도 전력 소비량이 늘어나야 합니다. ARM의 구조는 결코 x86이나 PPC의 주력 모델과 경쟁할만한 성능을 낼 수도 없고, ARM은 그러한 것을 지향하지도 않습니다.

추신: x86이 여러모로 확장을 해온 아키텍처이기는 하나, 무작정 전기를 먹기만 하는 아키텍처인 것은 아닙니다. 다만 경쟁 상대가 '임베디드' 시장에 있을 때만
문제가 될 뿐입니다. 지금의 코어 i5나 i7 프로세서의 idle 전력 소비량을 보면 몇 년전의 x86 프로세서보다 훨씬 적음을 알 수 있습니다. x86 역시 에너지 효율성에 대해
열심히 개선을 하고 있습니다. 다만 그 방향은 꽤 다른데, 인텔은 코어당 성능을 극대화하면서도 전력 관리 기능을 최대한 강화하여 평균 전력 소비량을 억제하는 방향을
택했고, AMD는 코어 하나의 최대 전력 소비량과 회로 크기를 줄이고, 대신 부족한 성능은 코어 수를 늘려 병렬 처리를 하도록 했습니다. 방향성으로는 AMD가 맞기는 하나,
현재 사용자들이 바라는 점을 가장 잘 이해한 것은 인텔입니다.

추신 2: 요즘은 이와 별도로 헤테로지니어스 코어가 주목받고 있습니다. 두 가지 또는 그 이상의 전혀 다른 아키텍처를 지닌 CPU를 하나로 묶는 것을 말하는데,
이렇게 하면 전력 효율성과 성능이라는 두 마리 토끼를 모두 잡을 수 있습니다. 예를 들어 성능에 그리 영향이 없는 단순 대기 작업이나 저해상도 영화 감상같은 것은 ARM을
쓰고, 이미지 편집이나 게임은 x86을 쓰는 형태입니다. 이미 이러한 구조는 실용화를 했는데, PS3 게임 콘솔에 들어간 CELL 프로세서 역시 이러한 구조를 갖고 있습니다.

코드명 Windows 8이라는 것이 ARM을 지원한다고 하는 것도 그냥 'ARM용 태블릿'을 생각한 것이 아니며, 이러한 헤테로지니어스 구조를 고려한 것으로 볼 수 있습니다.
Metro UI를 쓴 어플리케이션은 ARM으로 돌게 하고, 종전 Win32 어플리케이션은 x86 프로세서를 쓰도록 하면 간단한 작업은 최대한 저전력으로 하면서, 성능이 필요한 것도
복잡한 설정이나 재부팅 없이 실행할 수 있게 됩니다. 그 점에서 ARM과 x86은 철저한 경쟁자라고 볼 수는 없으며, 서로 부족한 면을 보완하는 관계에 가깝습니다.
한 때 인텔이 ARM 아키텍처를 라이선스하고(정확히는 DEC의 StrongARM을 인수), AMD도 ARM과 비슷한 MIPS 아키텍처를 쓰던 Geode(NS의 Geode 사업부 인수)를 내놓은 것도
x86만으로는 모든 프로세서 시장을 커버할 수 없다는 것을 잘 알았기 때문입니다.






'팁?' 카테고리의 다른 글

simulator vs emulator  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
자잘한  (0) 2013.07.19
dp돌릴때  (0) 2013.07.16
dfs할때  (0) 2013.07.13
Posted by bogus919
,

simulator vs emulator

팁? 2014. 9. 15. 14:32

게임 중에 시뮬레이션 게임들이 있죠.
그 시뮬레이션 게임들은 실제 상황을 시뮬레이션 해서 만드는 것입니다.
즉, 실제와 완전히 똑같을 필요까지는 없고 시뮬레이션하는 대상이 지니는 주요 특성만을 
재현해주면 되는 것입니다.
비행 시뮬레이션 이라면 하늘을 나는 것처럼 3D표현으로 화면에 보여주고
하늘을 나는 것처럼 조작할 수 있게 해주면 되는 것이죠.
물론 실험용 시뮬레이션이라면 바람이나 기후에 의한 영향이라던지
기체의 상태에 의한 영향 같이 더 자세한 특성들을 재현해줘야 하는 것이지만
그렇다고 해서 모든 것(화면 모습의 텍스쳐를 실제 현실처럼 자세하게 해줘야 한다거나 하는...)을
재현할 필요까지는 없습니다. 
심지어는 어떠한 시뮬레이션의 경우는 단순히 그 상황에 대한 관측 수치만 제공하는 경우도 있습니다.

그에 반해 에뮬레이터는 재현고자 하는 대상을 완벽하게 재현하는 것이 목표입니다.
어떠한 PDA를 에뮬레이션 하려고 한다면 PDA에 사용된 cpu가 처리할 수 있는 명령어들을
그대로 처리할 수 있는 가상의 cpu를 구현해야 하고 PDA에 사용된 디스플레이와 같은
해상도에서 PDA와 동일한 성능으로 PDA에서 돌아가는 프로그램을 사용할 수 있어야 합니다.
간단히 말하자면 에뮬레이터는 어떠한 하드웨어를 소프트웨어 적으로 재구현하는 것이죠.
(유사하게 하드웨어 -> 하드웨어는 짝퉁(카피) (중국의 짝퉁 자동차나 짝퉁 mp3같은... ) 
소프트웨어 -> 소프트웨어는 클론( 네이트온을 대신하는 Jateon 같은... )
소프트웨어 -> 하드웨어는 생각이 안나는군요. (이러는 경우가 있기는 하던가요;;)
이라고 할 수 있겠습니다. )

그리고 그 설명에서는

"시뮬레이터는 하드웨어도 포함할 수도 있지만
에뮬레이터는 소프트웨어적으로만 구현하는 것을 의미한다."

라고 이해하시면 될거 같습니다.
저 차이는 두가지를 완벽하게 구분하는데 사용하기는 힘든 특성이죠.

즉, 시뮬레이션은 소프트웨어적, 하드웨어적, 혹은 소프트웨어+하드웨어 등을 동시에 사용하여
어떠한 상황에 대한 자세한 데이터를 수집하거나 보여주는 것이 목적이고,

에뮬레이션은 어떠한 하드웨어를 소프트웨어적으로 구현하여 대상 하드웨어를 사용하는 것과
동일하게 사용하는 것이 목적이라고 할 수 있겠습니다.

'팁?' 카테고리의 다른 글

x86 vs ARM  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
자잘한  (0) 2013.07.19
dp돌릴때  (0) 2013.07.16
dfs할때  (0) 2013.07.13
Posted by bogus919
,
int add(int a, int b){ return a+b; } int main(void){ z = add(x, y); return 0; } 사실 그동안 무지해서 구분안하고 썼는데

함수를 호출할때 써주는 x, y가 인자(argument)이고

함수정의부분에서 넘겨준 x, y를 받는 a, b가 매개변수(parameter)이다

부끄럽군

'팁?' 카테고리의 다른 글

x86 vs ARM  (0) 2014.09.15
simulator vs emulator  (0) 2014.09.15
자잘한  (0) 2013.07.19
dp돌릴때  (0) 2013.07.16
dfs할때  (0) 2013.07.13
Posted by bogus919
,

자잘한

팁? 2013. 7. 19. 08:08

1.

for(int i=0; i<strlen(str); i++)

이렇게 for문 안에 strlen(str)이 있으면 매 반복마다 함수를 호출하기 때문에 시간이 더 걸린다

따라서 이렇게 해주는게 시간이 더 빠르다

int len = strlen(str); for(int i=0; i<len; i++)

2.

두개의 값중 더 큰 max를 사용할 때가 많은데

stl의 algorithm의 max를 사용할 수도 있고

직접 max함수를 만들수도 있는데 직접 만든게 더 빠르다


3.

헤더파일을 선언할수록 메모리 사용량이 많아진다


4.

지역변수보다 전역변수를 사용할때 메모리 사용량이 많아진다

'팁?' 카테고리의 다른 글

simulator vs emulator  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
dp돌릴때  (0) 2013.07.16
dfs할때  (0) 2013.07.13
최대값, 최소값 구하는법  (0) 2013.07.08
Posted by bogus919
,

dp돌릴때

팁? 2013. 7. 16. 19:12
http://www.acmicpc.net/problem/2780

쉬운 dp문제인데, 아주 사소한 차이지만 실행시간을 확 줄일 수 있다

같은 dp를 돌리는데 여러개의 테스트케이스를 돌릴 경우,

매번 테스트케이스마다 dp를 계산하는게 아니라

아래처럼 맨 처음 dp쭉 돌리고 테스트케이스마다 이미 나온 결과를 그냥

참조하기만 하면 된다. 사소하지만 나중에는 큰차이가 될수도 있을 것 같다

#include #include using namespace std; int tc, N; int main(void){ // freopen("input.txt", "r", stdin); scanf("%d", &tc); int d[1005][10]; fill(d[1], d[1]+10, 1); for(int i=2; i<=1000; i++){ d[i][0] = (d[i-1][7])%1234567; d[i][1] = (d[i-1][2] + d[i-1][4])%1234567; d[i][2] = (d[i-1][1] + d[i-1][3] + d[i-1][5])%1234567; d[i][3] = (d[i-1][2] + d[i-1][6])%1234567; d[i][4] = (d[i-1][1] + d[i-1][5] + d[i-1][7])%1234567; d[i][5] = (d[i-1][2] + d[i-1][4] + d[i-1][6] + d[i-1][8])%1234567; d[i][6] = (d[i-1][3] + d[i-1][5] + d[i-1][9])%1234567; d[i][7] = (d[i-1][4] + d[i-1][8] + d[i-1][0])%1234567; d[i][8] = (d[i-1][5] + d[i-1][7] + d[i-1][9])%1234567; d[i][9] = (d[i-1][6] + d[i-1][8])%1234567; }while(tc--){ scanf("%d", &N); int sum = 0; for(int i=0; i< 10; i++) sum += d[N][i]; printf("%d\n", sum%1234567); } return 0; }

'팁?' 카테고리의 다른 글

simulator vs emulator  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
자잘한  (0) 2013.07.19
dfs할때  (0) 2013.07.13
최대값, 최소값 구하는법  (0) 2013.07.08
Posted by bogus919
,

dfs할때

팁? 2013. 7. 13. 17:14
dfs를 리커시브로 다시 호출할때
호출하기전에 방문했는지 조건확인하고 방문하는게
ex)
if( visit[y-1][x] == 0 ) dfs(y-1, x); 호출한후 처음에 조건확인후 리턴하는것보다 더 실행시간이 더 적다
ex
void dfs(int y, int x){ if( visit[y][x] ) return; }

'팁?' 카테고리의 다른 글

simulator vs emulator  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
자잘한  (0) 2013.07.19
dp돌릴때  (0) 2013.07.16
최대값, 최소값 구하는법  (0) 2013.07.08
Posted by bogus919
,

1. 최대, 혹은 최소값을 나타내는 식을 구한후

그 식을 이용하여 최대, 최소값을 구한다


2. 어떠한 상황에서 최대최소값을 구하는지 생각하고

그 상황에서의 값을 구하면 그게 최대, 최소

언제 최대최소가 되는지만 잘 생각하면 훨씬 쉽게 최대최소값을 구할 수 있다

수학문제 풀때 하던건데 까먹고 있었다

'팁?' 카테고리의 다른 글

simulator vs emulator  (0) 2014.09.15
parameter(매개변수), argument(인자)  (0) 2013.07.27
자잘한  (0) 2013.07.19
dp돌릴때  (0) 2013.07.16
dfs할때  (0) 2013.07.13
Posted by bogus919
,