2010-01-22 4 views
1

특정 응용 프로그램에서는 개별 색인 정보를 유지하면서 중첩 루프를 하나로 축소해야합니다.효율적인 루프 붕괴

for j in N: 
    for i in M: 
    ... A(i,j) ... 

// Collapse the loops 
for ij in MN: 
    ... A(i,j) ... 

말 .IN 문 (휴식 벡터화, 분기 예측 문제) 내가 해낸 그래서 만약 부문/모듈 (비용이 많이 드는 작업)을 사용하여 IJ에서, J를 나는를 복구하는 확실한 방법을 살펴 보았다 다음 (C 스타일 비교 사용) :

j += (i == m) 
i *= (i != m) 
++i, ++ij 

아마도 더 좋은 방법일까요? 감사합니다

+0

이것은 언어에 무관심한 질문이 아닙니다. 하스켈이나 파이썬에서 다른 언어로는 작동하지 않는 방법을 생각할 수 있습니다. 중첩 루프를 축소해야하는 이유를 설명해 주시겠습니까? –

+0

물론 원칙적으로 튜링 언어는 파이썬 제품/범위 조합을 달성 할 수 있지만 효율적이지 않을 수 있습니다. 루프 붕괴의 주된 이유 : 행렬 반복자, 저수준 벡터 라이 제이션 (SSE/큐다를 생각하십시오) – Anycorn

답변

0

다른 방법으로가는 것이 저렴할 수 있습니다. 일반적

for j in N: 
    for i in M: 
    ij=j*i+j 
+0

또는 'ij = 0; j in N : M for i : ...에 대해; ij + = 1' –

7

, 그것은 한 바와 같이, 루프를 축소 성능 이점을 제공하지 않는다.

컴파일러는 종종 이러한 루프를 축소하지만 일반적으로 예기치 않은 방식으로 수행합니다.

특정 언어에서

, 또는 특정 플랫폼에서, 당신은에 의해 일반적으로 루프 속도를 높일 수 있습니다 : 몸 '인라인'에서 호출 된 기능을 아래로

  • 계산, 또는에서 코드를 가진

    • 을 일반적으로 명령 라인 옵션을 통해 - - 오히려 별도의 기능
    • 컴파일러 구성보다 루프 신체 풀다 '에 루프 프레임 포인터를 제거하는 등

    니어 모든 경우에있어서 그러한 노력이 보장되는지 확인하기 위해 코드를 프로파일 링해야합니다.

    일반적으로, 내 경험에서,이 같은 중첩 된 루프에 의해 지배된다

    1. 용기; 가능하다면 복싱과 경계 검사를 피하십시오. 당신이 안전하다는 것을 알고 있습니다.
    2. 그들 안에 다른 방법을 불러내는 데 드는 비용; 사용할 수있는 경우 '인라인'사용
    3. 잘못된 참조 지역에 의한 파이프 라인 실속. 가능한 경우 메모리를 다시 배열하십시오.
    4. 두 번째 조건에 의한 파이프 라인 실속; if 및 간접 참조가 적어집니다.

    그러나 문제가있는 도메인 및 플랫폼에 대한 조언이되지 않을 수 있습니다. 프로필!

  • +0

    ++ 오른쪽, 오른쪽, 오른쪽. 나는 프로필의 대신에 단지 stackshots (http://stackoverflow.com/questions/406760/whats-your-most-controversial-programming-opinion/1562802#1562802)를 사용한다고 말하고 싶다. 왜냐하면 거의 항상 이런 종류의 최적화가 "짖는 소리" 위로 잘못된 나무 ". –

    +0

    프로그래밍은 사람이다. 컴퓨터 용으로 컴파일하는 것은 –

    +1

    이다. 행렬/배열 반복자, 최적화 (내부 루프 만 벡터화), cuda 프로그래밍, OpenMP 프로그래밍 (3.0은 그 것이다). 컴파일러는 매우 훌륭하지만 때때로 인간의 도움이 필요합니다. – Anycorn