• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

반복문 최적화 관련 질문 있습니다!

22.03.11 17:38 작성 조회수 149

0

2.compute bound - loop inversion, Optimization of Computer Programs in C 이 부분을 읽고서 무슨 뜻인지 알기 어려웠는데 수업을 레지스터를 하나 더 적게 사용할 수 있겠다는 생각이 들었습니다.

RayTracing In One Weekend 9.5 A Scene with Metal Spheres 를 살펴보면 이미지 픽셀을 순회할 때 전위 감소 연산자를 사용하고 있는데 최적화 기법을 고려하여 배열은 순회하도록 작성됐다고 생각해도 괜찮을까요?

...

    std::cout << "P3\n" << image_width << " " << image_height << "\n255\n";

    for (int j = image_height-1; j >= 0; --j) {
        std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush;
        for (int i = 0; i < image_width; ++i) {
            color pixel_color(0, 0, 0);
            for (int s = 0; s < samples_per_pixel; ++s) {
                auto u = (i + random_double()) / (image_width-1);
                auto v = (j + random_double()) / (image_height-1);
                ray r = cam.get_ray(u, v);
                pixel_color += ray_color(r, world, max_depth);
            }
            write_color(std::cout, pixel_color, samples_per_pixel);
        }
    }

...

외부 루프는 --j인데 내부 루프는 ++i인 이유에 대해서도 조금 궁금합니다. 리틀엔디안 빅엔디안이랑 관련이 있을까요?

현업에서 그래픽스 라이브러리 API를 가져다 쓰거나, 만들어 쓸 때 인덱스를 --i를 선호하는지 ++i를 선호하는지 궁금합니다!

답변 1

답변을 작성해보세요.

0

이런 부분은 너무 과한 걱정입니다.
라이브러리 제작자가 아닌 컨텐츠 제작자 입장에선
--i나 ++i에 고민하기보단 알고리즘에 신경쓰는게 훨 낫습니다.
가독성 때문에 ranged for를 사용하기도 하는 시점에, --i ++i는 너무 디테일인 것 같네요.

patjuk님의 프로필

patjuk

질문자

2022.03.11

C만 하다가 어셈블리하면서 궁금증이 해소되니 좀 신이 난 것 같아요. ;> 시간나면 말씀해주신 ranged for를 살펴보면 될 것 같습니다. 말씀 감사합니다. 

위에 올려놓으신 코드를 보니, 저 부분은 성능보다는 알고리즘 특성 때문에 그런 것으로 보입니다.
일부 알고리즘 (ex. 특정 값에 따라 제거를 해야 한다거나..)의 경우 뒤부터 시작해서 스캔하는게
효율이 좋을 수도 있고요. 현재 알고리즘처럼 랜덤 요소를 추출할 때 초반/후반부 데이터로 뭔가를 하는 필요성이 생길 수도 있죠.

그리고 C와 다르게 C++은 함수 초반에 그렇게 데이터를 다 정의하진 않습니다.
실제로 어셈으로 까보면, 초반부에 하다 중반부에 하나 완전히 동일합니다.
물론 변수가 class라면, while { }내부에서 생성자/소멸자가 실행되느냐 여부는 다를 수 있지만
대체적으로는 큰 차이가 없습니다.