A 컴파일러 최적화 영역

2607 단어 swiftllvmcompilers
Compilers에 지원하는 동안 면접관이 제 LICM(Loop Invariant Code Motion) 최적화 패스에 대해 물었습니다. 여기에서 동일한 값을 계산하는 루프 내부의 변수를 루프 외부로 이동하여 계산할 루프에 대한 명령 수를 줄일 수 있습니다.

나는 그들에게 대답했고, LICM 패스는 불변 피연산자가 있는 불변 명령(부작용 없이, 즉 로드, 저장, 호출, 휘발성 등)을 이동할 것입니다. 항상 같은 것을 계산하는 명령은 제거됩니다. 또한 도미네이터 트리의 일부여야 합니다. 예를 들어 경비원 (만약 - 확인)

그들은 나에게 변경 가능한 전역 변수에 대해 물었습니다. 짧은 답변: 아니요, 최적화할 수 없습니다.

복잡한 답변: 가능할 수도 있습니다.
  • 전역 변수가 두 번(모든 스레드에서) 변경되고 값이 안정화된 다음 루프를 통과합니다. 이런 경우 상수로 활용할 수 있습니다
  • .
  • GPU와 관련하여 전역 변수는 곱하기 및 추가 명령에 많이 사용됩니다. 이를 위해서는 전역 변수에 대한 동시 동시 다중 읽기 쓰기 요청이 필요합니다. 여기서 이 변수는 LICM 패스에 의해 건드리지 않습니다.

  • 이 변경 가능한 전역 변수를 최적화하는 것이 LLVM을 생성하거나 MLIR 패스를 사용하기 전에 Intermediate 패스에서 더 잘 수행될 수 있다고 생각합니다.

    그만한 가치가 있습니까? 이러한 전역 변수가 변이된 경우 이러한 전역 변수를 감지하는 데 복잡성이 너무 크다고 생각합니다. 시간은 컴파일러의 다른 영역에서 작업하는 데 더 잘 사용될 수 있습니다.

    최적화 문제는 소프트웨어 개발자가 보다 쉬운 방법으로 해결할 수 있습니다.

    사전 최적화:

      int x = 5; // Defined Global scope across multiple threads
      x++;
      thread1 {
        x++;
      }
      waitForThread1ToComplete();
      while (true) {
        print(x*x); // x is global mutable, and is mutated, can't LICM
    // is mutated: meaning if not mutated, can show error to dev
    
    


    개발자 작성 제안: 중간 상수 변수를 사용하고 전역 변수를 할당합니다.

      waitForThread1ToComplete();
      const int copyX = x;
      while (true) {
        print(copyX*copyX); // copyX is constant, LICM can optimize this
    

    좋은 웹페이지 즐겨찾기