구)홈페이지 오탈자 보기
Blog2Book, 프로그래머가 몰랐던 멀티코어 CPU 이야기

 

페이지오탈자 내용등록일
118

(18p 아래 6번째줄)

40년이 지나 ==> 30년이 지나

2010-07-111
223

(23p 5번째줄)

프로그래머가 실수로 '문법에' 틀리거나 ==> '문법이'

2010-07-081
230

(첫번째 단락)

함수호출규약(calling convections) ==> 함수호출규약(calling conventions)

2013-08-093
237

((5)에 대한 설명)

data[index]의 주소를 얻게 되고 r2가 이 값을 가진다
==> r2가 아니라 r3가 옳습니다.

2010-06-171
240

(두 번째 문단)

x86의 범용 레지스터 개수는 비록 프로그래머와 약속한대로 ~
==> '비록' 삭제

2010-06-171
345

(45페이지)

RTL의 약자 설명이 틀렸습니다. Register-Transfer Language가 아니라  Register-Transfer Level 입니다.

2011-08-033
355

(55p 맨 아래줄)

마치 여러 ...  작동한다고 배웠다 ==> 마치 ... 작동하는 것처럼 보인다고 배웠다.

2010-06-301
359

(두 번째 줄)

해법은 ~~~ 기억해야 한다. ==> 해법은 ~~~ 기억하는 것이다.

2010-06-181
359

(59p 그림 3-5)

[그림 번호 오류] 그림 3-5의 올바른 그림 번호는 그림 3-3입니다.

2010-06-301
464

(64p, 수식 4-1)

S: 성능 향상(스피드업) ==> S: 최적화된 부분의 성능 향상

2010-06-211
467

(첫째줄)

프로세서/스레드 사이에 ==> 프로세스/스레드 사이에

2010-06-221
469

(69p, 가운데 수식)

T=(0.5*1 + 0.2*2 + 0.1*3 + 0.2*4)(사이클/개) * 1,000,00,000(개) * 1/2,000,000,000(사이클/초) = 1초
==>
T=(0.5*1 + 0.2*2 + 0.1*3 + 0.2*4)(사이클/개) * 1,000,000,000(개) * 1/2,000,000,000(초/사이클) = 1초

2010-06-211
575

(75p, 첫째줄.)

프로그래머는 자기가 만든 프로그램'이' 당연히 프로세서'를' 정확하게 실행해줄 것으로 기대한다.
==>
프로그래머는 자기가 만든 프로그램'을' 당연히 프로세서'가' 정확하게 실행해줄 것으로 기대한다.

2010-06-221
581

(두 번째 단락 세 번째 줄)

[부연 설명] 컴파일러가 어떤 주소 값을 가리킬지 소스 분석으로 ~~
==>
컴파일러가 두 메모리 연산 사이에 의존성을 예측하는 것은 일반적으로 매우 어려운 문제이다. 그 이유는 의존성 여부를 판단하려면 결국 두 메모리 연산이 가리키는 주소 값의 범위를 알아야 하는데, 코드를 실행하지 않고서는 이것을 알아내기가 굉장히 어렵기 때문이다.

2010-06-241
688

(소스 6-1 line 2)

fetech() ==> fetch()

2010-06-221
699

(99p 두번째 단락 7째 줄)

보통 예외(exception)과 ==> 보통 예외(exception)와

2010-06-301
6101

(101p 소스 5-8)

소스 5-8 ==> 소스 6-8

2010-06-301
7106

(p106 첫 단락 마지막줄)

처리율리 ==> 처리율이

2010-07-091
7123

(p.123 두번째 단락 첫번째 문장)

Ferret은 주어진 ~ ==> Ferret은 주어진 디텍터리나 데이터베이스에 있는 이미지를 이미지 내용을 이용하여 서로 비교하는 프로그램이다.

2010-07-071
7125

(125p 소스 7-4 중 LoadThread 함수 내)

queue_enqueue_wait(&q_load_seq, data); ==> queue_enqueue_wait(&q_load_seq, load);

2010-06-301
8141

(p141, 그림 8-5)

명령 2 : r2 = r0 + 1; ==> 명령 2 : r1 = r0 + 1;

2010-06-291
8142

(142p, 소스 8-3의 3,4번째 명령어 주석)

3: ...  ;; r0를 F0, ...
4: ...  ;; r0를 F0, ...
==>
3: ...  ;; r0를 F1, ...
4: ...  ;; r0를 F1, ...

2010-06-291
8143

(143p, 첫번째 문단 2번째, 5번째줄)

첫번째 문단 2번째줄
여기서는 F2를 얻었다 ==> 여기서는 F0를 얻었다

5번째줄 마지막 부분
물리 레지스터 F0으로 바꾸었다 ==> 물리 레지스터 F1으로 바꾸었다

2010-06-291
9153

(p153, 대화문 밑 문장의 4번째줄)

[부연 설명]
하이퍼스레딩과 동시 멀티스레딩 기술이 약간 혼동되어 쓰였습니다. 하이퍼스레딩은 동시 멀티스레딩 기술의 한 구현의 예입니다. 인텔 펜티엄 4와 Core i7에 사용된 하이퍼스레딩은 두 개의 논리 프로세서를 만들지만 두 개 이상도 가능하다는 설명을 쓰려다가 단어 선택에 약간 혼란이 있었습니다.

2010-06-301
9157

(첫째/둘째 단락.)

비선점(preemptive)라고 잘못 설명이 되었습니다. 선점(preemptive)로 되어야 합니다. 둘째 단락에서도 "비선점형 멀티태스킹"이 아니라 "선점형 멀티태스킹"이 옳은 표현입니다.

참고로 비선점은 non-preemptive, 선점은 preemptive 입니다. 미세 단위 멀티스레딩은 매 사이클마다 CPU가 강제로 스레드를 번갈아가며 스케줄링을 합니다. 선점형 스케줄링 역시 특정 시간이 지나면 강제로 운영체제가 다음 태스크를 스케줄링하므로 선점형 스케줄링이 미세 단위 멀티스레딩과 닮아 있습니다.

2013-07-123
9158

(158p 9째 줄)

Swith-On-Event ==> Switch-On-Event

2010-06-301
10167

(167p 두번째 문단 밑에서 6번째줄)

불과 몇 픽셀의 단색 모니터에 글씨가 나왔다.
==>
불과 몇 픽셀 밖에 안 되는 글씨가 단색 모니터에 나왔다.

2010-07-011
10174

(세 번째 단락 세 번째 줄)

앞에서 윈도라는 명령어 개념을 ==> 앞에서 명령어 윈도우라는 개념을

2010-06-241
10176

(p.176 병렬컴퓨터의 개념, 두 번째 줄)

병령 컴퓨터 ==> 병렬 컴퓨터

2013-03-223
10177

(177p, 2.의 설명 3번째)

구조에 따라 데이터'를' 주고받는 논리적인 형태가 다르다.

2010-07-011
10180

(첫 번째 단락 네 번째 줄)

많은 이들에게 익숙한 멀티스레드 방법론이 적용된다.
==> (설명이 모호해서 보다 명확히 했습니다) 이미 많은 개발자가 하고 있는 일반적인 멀티스레드 프로그래밍 방법론이 여기에 해당된다.

2010-06-241
10186

(p186, 4번째줄)

nVidia의 ... 그래픽 카드는 160GB/s의 대역폭이 엄청나다.
==>
NVIDIA의 ... 그래픽 카드는 대역폭이 160GB/s이 될 정도로 엄청나다.

2010-07-011
10188

(188p 두번째 문단 첫번째줄, 189p 첫번째줄)

그림 10-7 ==> 그림 10-6 (그림 10-6이 ILP의 한계를 나타낸 그림 입니다.)

2010-07-011
10189

(그림 10-13)

명령어 당 사이클(IPC) ==> 사이클 당 명령어(IPC)

2013-07-113
11191

(책 전체)

1쇄에서는 NVIDIA의 회사 이름을 nVidia로 적었습니다. 공식적으로 NVIDIA로 써야 합니다.

2010-07-011
11206

(소스 11-4 line 7, 8, 9, 10, 13, 21)

cudaMalloc(gpuA, N) ==> cudaMalloc(gpuA, size)

Line 8, 9, 10, 13, 21의 N도 모두 size로 변경되야 합니다. 

2010-06-301
11206

(소스 11-4 line 18)

(gpuA, gpuB, gpuC) ==> (gpuA, gpuB, gpuC, N)

2010-06-301
11207

(소스 11-5 line 10)

for (int k = 0; k < Width; ++k) ==> for (int k = 0; k < N; ++k)

2010-06-301
11209

(소스 11-6)

Line 9, 11의 gpuA, gpuB, gpuC의 접근이 float**로 가정하고 적혀있습니다. 정확한 표현은 아래와 같습니다.

9: sum += gpuA[row*N + k] * gpuC[k*N + col];
11: gpuC[row*N + col] = sum;

2010-07-011
12218

(p218, 3번째줄)

이 루프는 또한 data[1]부터 data[N-1]까지 접근하므로 공간적 지역성도 있다.
==>
이 루프는 또한 data[0]부터 data[N-1]까지 순차 접근하므로 공간적 지역성도 있다.

2010-07-061
12224

(224p 2번째 문단 1째 줄)

캐시 라인 하나 할당하는 ==> 캐시 라인 하나를 할당하는 

2010-06-301
12230

(230p 박스에 있는 공식)

미스 비율(miss rate = 캐시 히트 / 캐시 미스)
==>
미스 비율(miss rate = 캐시 미스 / (캐시 미스 + 캐시 히트))

2010-06-301
12230

(p230 5번째 줄)

이 정책은 USB 메모리 ... 저장 '장치는' 오히려 나쁘다 ==> '장치에는'

2010-07-051
13242

(p242, 밑에서 2번째)

분기 예측에 대해 이야기하기 전에 '분기문이' ==> '분기문을'

2010-07-051
13245

(p245, 첫번째 문단 끝에서 두번째 줄)

7-E은 ==> 7-E는

2010-07-051
13246

(p246, 그림 13-2의 설명)

그림 13-2  100번지에 저장된 값, '1004로' 분기한다 ==> '20으로'

2010-07-051
13250

(p250, 소스 13-3)

1: if(i == 10) goto 3: ==> if(i == 10) goto 4:

소스 13-3 아래의 "만족해 3번으로 간다면"도 "만족해 4번으로 간다면"으로 수정해야 합니다.

2010-07-051
13254

(254p 그림 13-7 정확도 행)

그림 13-7의 정확도의 OX 표시에 오류가 있습니다. 매 루프 순환 7 마다 정확도는 O가 아니라 X가 되어야 합니다.

2010-06-301
13255

(line 11)

sizeof(predictor_entry_size) ==> sizeof(bool)*size_

2010-06-221
13261

(261페이지 5번째 줄)

테블 ==> 테이블

2012-05-223
13262

(line 12)

sizeof(predictor_entry_size) ==> sizeof(bool)*size_

2010-06-221
13262

(소스 13-8, line 21)

XOR ==> ^

2010-07-051
14270

(270p 아래서 6째 줄)

Compute의 ... 4번 또는 7번이 ==> Compute의 ... 2번 또는 4번이

2010-06-301
14270

(p271, 첫번 째 줄)

그러나 소스 14-2에서 ==> 그러나 소스 14-1에서

2010-07-051
14272

(272p 3째 줄)

소스 14-3에 적어보았다 ==> 소스 14-2에 적어보았다

2010-06-301
14273

(273p 아래부터 7째 줄)

소스 14-3의 4,5,6은 ==> 소스 14-2의 4,5,6은 

2010-06-301
14275

(275p 소스 14-4 2째 줄)

dir->dir->type ==> dir->tdir_type 

2010-06-301
14278

(p278, 밑에서 3번째 줄)

예측률을 높다 ==> 예측률을 높인다

2010-07-051
15281

(281p, 그림 15-1)

2, 5번 명령어 끝에 ;이 빠졌습니다.

2010-07-121
15282

(소스 15-1 설명)

메모리 의존성 ... r1 값이 같다면 ==> 메모리 의존성 ... r1의 값과 r7의 값이 같다면

2010-06-301
15282

(p282 하단 각주)

1, 2, 3 명령어가 먼저 수행될 수 있다 ==> 1, 2, 3 명령어 보다 먼저 실행될 수 있다

2010-07-061
15285

(285p 아래부터 7째 줄)

그런데 0x110 로드 ==> 그런데 0x110 로드는

2010-06-301
15288

(p288, 마지막 문단 첫번째 줄)

변수 x,y,z,b는 ==> 변수 x,y,a,b는

2010-07-061
15291

(p291, 소스 15-6 첫번 째 줄)

double** L = malloc(...), ==> double** L = malloc(...);

2010-07-061
16311

(311p 그림 16-6)

그림 16-6의 의미을 좀 더 자세히 설명하겠습니다.

2차원 배열을 접근 할 때 매 루프 순환에서 그림 (a)처럼 같은 행에서 인접한 열로 접근하는 것이 아니라 그림 (b)처럼 열이 같고 행 단위로 접근할 때, 만약 한 행의 크기가 캐시 라인보다 크다면, 매번 캐시 미스가 일어날 수 있음을 뜻합니다.

2010-06-301
16311

(p311, 소스 16-11)

1: void MatrixMultpliy ==> 1: void MatrixMultiply

5: a[i][j] += b[i][k] + c[k][j]; ==> 5: a[i][j] += b[i][k] * c[k][j];

2010-07-061
16315

(p315, 4째줄)

가상 메모리 주소가 같으면 ==> 가상 메모리 주소값 같으면

2010-07-061
17322

(322p 7째 줄)

그런데 VLIW는 ~ 컴파일러가 찾는다. 그런데 컴파일러가
(그런데가 반복 사용되었습니다. 그런데 삭제)

2010-06-301
17326

(326페이지)

326페이지에 나오는 상수 전파는 복사 전파로 고쳐져야 합니다. 

(1) 컴파일러 최적화 중 상수 전파 (constant propagation)를 생각하면 손쉽게 temp를 제거할 수 있다. ==> 컴파일러 최적화 중 복사 전파 (copy propagation)를 생각하면 손쉽게 temp를 제거할 수 있다.

(2) 또 다시 상수 전파를 ==> 또 다시 복사 전파를

(3) 이상적으로 상수 전파 최적화가 ==> 이상적으로 복사 전파 최적화가

2013-08-093
17328

(p328, 마지막줄)

2번 라인의 'sp=$0.1'을 보면 ==> 2번 라인의 'sp=$r0.1'을 보면

2010-07-061
17329

(p329, 각주 밑에서 두번째 줄)

VEX 컴파일러는 $r10을 ==> VEX 컴파일러는 $10.0을

2010-07-061
17329

(마지막 단락)

여기서 컴파일러가 상수 전파 최적화를 ==> 여기서 컴파일러가 복사 전파 최적화를

2013-08-093
17331

(p331, 첫번째 문단)

$0.3, $0.4, $0.5 ==> $r0.3, $r0.4, $r0.5

2010-07-061
18338

(339p 소스 18-4 9째 줄)

lock 변수는 ==> lock_var 변수는

2010-06-301
18339

(p339 각주)

__sync_bool_compare_and_swapd ==> __sync_bool_compare_and_swap

2010-07-071
18340

(340p)

베리어(barrier) ==> 배리어(barrier)

2010-06-301
18346

(346p 소스 18-6 line 10)

i < td->my_row_end (<를 <=로 고쳐야 합니다)

2010-06-301
18346

(소스 18-6의 12라인)

mandel 은 Mandelbrot 으로 쓰는 것이 더 명확하겠습니다. Mandelbrot을 줄여서 mandel이라 썼습니다.

2013-08-093
18347

(p347, 소스 24번째 줄)

pthread_create 함수의 4번째 인자는 td가 되어야 합니다.

2010-07-071
18347

(p347, 소스 18-6 설명)

열 단위로 ==> 행 단위로

2010-07-071
18349

(첫번째 단락 마지막 줄)

[3] 또는 Story 19에서 자세히 읽을 수 있다. ==> [3] 또는 Story 20에서 자세히 읽을 수 있다.

2013-08-093
18351

(p351, 2째 문단 4째줄)

쉽지 않기 문제다 ==> 쉽지 않은 문제다

2010-07-071
18354

(소스 18-3 5째 줄)

for가 아닌 _for로 표기한 것은 Ct라는 언어에서는 컴파일러에게 힌트를 주고자 별도로 정의된 for와 유사한 매크로를 씁니다. 그러한 의미에서 _for로 한 것입니다.

2010-06-301
18355

(355p 3째 줄)

버전을 실지 않는다 ==> 버전을 싣지 않는다

2010-06-301
18356

(356p 5째 줄)

직접적으로 데이터 주고받는 코드를 ==> 직접적으로 데이터 교환 코드를

2010-06-301
19358

(p358, 대화상자 첫째줄)

도대체 왜 printf 넣었다고 ==> 도대체 왜 printf를 넣었다고

2010-07-071
19360

(360p 아래서 4째 줄)

Story 18의 소스 18-3 ==> Story 18의 소스 18-4

2010-06-301
19367

(367p 소스 아래 2째 줄)

공유 변수인 gCurrentScript라는 변수를 ==> 공유 변수인 gCurrentScript를 

2010-06-301
19371

(p371, 마지막 문단 첫째줄)

그림 19-5 역시 ==> 그림 19-6 역시

2010-07-071
19372

(372p 그림 19-7 스레드 2)

js_MarkAtrom ==> js_MarkAtom

2010-06-301
19372

(372p 아래부터 3째 줄)

그림 19-5는 ==> 그림 19-6은

2010-06-301
19374

(p374, 둘째문단 4째줄)

그림 19-5가 ==> 그림 19-6이

2010-07-071
20378

(378p 그림 20-1 아래 1째 줄)

1번 프로세서가 ==> 1번 프로세서(TestThread2)가

2010-06-301
20380

(p380, 소스 2 or 7, 8 라인)

CACHE_ALIGN_VC ==> CACHE_ALIGN_MSVC

2010-07-071
20384

(p384, 둘째문단 밑에서 둘째줄)

t1:3 -> t2:3 -> t1:3 -> t2:4
==>
t1:3 -> t2:3 -> t1:4 -> t2:4

2010-07-071
20385

(385p 아래서 2째 줄)

__atmoic ==> __atomic

2010-06-301
20385

(p385, 둘째문단 둘째줄)

그렇다 하더라도 락이 ==> 그렇다 하더라도 TM이

2010-07-071
20386

(p386, 첫째문단 뒤에서 둘째줄)

TM 구현 문제뿐만 특히 ==> TM 구현 문제뿐만 아니라 특히

2010-07-071