2017-02-23 1 views
7

데이터가 캐시되지 않으면 주 메모리에 액세스하는 데 대기 시간이 길다는 것을 알고 있습니다. 이 질문에 대한 답변은 입니다.메인 메모리에 묶이지 않는 함수의 복잡성은 무엇입니까?

일반 데스크탑 PC에서 주 메모리에 절대 바인딩되지 않는 기능은 무엇입니까?

나는 25-30GB/s (DDR3 RAM, 듀얼 채널 모드)의 대역폭을 가진 최신 RAM에 대해 읽었습니다. 내가 알 수있는 한, 현대 인텔 프로세서의 단일 코어는 최신 SIMD 명령어 세트를 사용하여 명령어 당 최대 32 바이트를 저장할 수 있습니다. 최대 4 * 10^9 명령으로 실행할 수 있습니다. 따라서 효과적으로 약 120GB/s를 출력 할 수 있습니다. 주어진 스레드가 8 개인 프로세서의 경우 최대 출력은 최악의 경우로 약 960GB/s입니다.

프로세서는 최대 36 배의 데이터를 RAM에 쓸 수 있습니다. SIMD 저장소 또는로드 당 36 개 이상의 사이클 (또는 일반 8 바이트 저장소 또는로드 당 9 개 이상의 사이클) 동안로드/저장 작업을 실행하지 않는 함수가 주 메모리에 절대 바인딩되지 않는다고 가정하는 것이 안전합니까? 이 추정치를 크게 낮추거나 어떤 이유로 너무 낮을 수 있습니까?

내가 가진 것을 감안할 때 : 더 나은 (또는하지 악화) 주어진

C(A(X), B(X)) 

D(X) 

을 구현하는 것입니다 때 가이드 라인을 찾고

X = (x_1, x_2, ..., x_n) // dataset, large enough to make good use of caches 
a(x), b(x), c(x, y), d(x) := c(a(x), b(x)) // functions that operate on elements 
A(x) := (a(x_1), a(x_2), ..., a(x_n)) // functions that operate on data sets 

그 첫 번째 구현은 캐시 및 레지스터에 더 많은 부담을 주며 두 번째 구현에는 더 많은로드/저장 작업이 필요합니다.

(물론, 벤치마킹 할 수 있다고 말해도 괜찮습니다.하지만 때로는 교육용 추측을하고 나중에 문제가되거나 병목이 될 때만 다시 방문하고 싶을 때가 있습니다.)

+0

@RossRidge 용어에 대해 알아두면 좋습니다. 이 질문을 편집하여 작업을로드/저장 작업으로 참조했습니다. 그래도 질문의 요점은 유효합니까? –

+0

글쎄, 그 대답은 그것이 달려 있다고 생각합니다. 예측할 수없는 분기를 사용하여 코드를 실행할 때 효과적인 CPU 속도가 급격히 떨어지면서 작은 RAM 액세스에서는 DRAM 속도가 크게 떨어집니다. –

+1

나는 공식이 여전히 동일하다고 믿는다 : 대역폭 /로드 크기 = 초당로드 수; 거기에서 : (캐시 된)로드 당주기/CPU의 빈도 =로드 당 초. (1 초당 1 초)/초당 부하 = 부하 사이에서 낭비하는 시간; * 낭비 할 시간 = 빈도 = 짐 사이 낭비. 호랑이 패킷 계산의 뒷면이 정확하면 (나는 의심 스럽다). –

답변

1

나는 CPU가 다음 데이터 항목을 캐시로 프리 페치 할 수있는 방법으로 코드가 작성되었는지 여부에 달려 있다고 생각한다. 만약 그것이 잘못된 데이터를 프리 페치하면 현재 데이터를 처리하는 데 소요되는 시간에 관계없이 여전히 메모리 바운드가됩니다.

여러 스레드가 동일한 주소 (데이터가 다른 캐시 행에있을 것임)에 쓰는 경우 올바르게 페치 된 경우에도 다른 스레드가 해당 주소에 쓰고 있으면이를 덤프하고 재실행해야합니다 주 메모리에서 다시 읽습니다.

요약하면 나는이 수준에서 이러한 종류의 것들에 대해 추론 할 수는 없으며 당신이 가진 정확한 시나리오에 달려 있다고 생각합니다.

관련 문제