2013-11-23 3 views
3

OpenGL 응용 프로그램을 최적화하려면 상대적으로 작은 배열 (8-64 값)의 비싼 처리 (그래픽 카드로 업로드)를 수행하는 핫 스폿이 하나 있습니다. 값은 변하지 만 대부분의 시간은 일정하게 유지됩니다. 따라서 대부분 효율적인 솔루션은 변경되었을 때만 배열을 업로드하는 것입니다. 데이터가 변경되기 , 그러나 이것은 많은 코드 변경해야하고, 빠른 테스트를 위해 내가 너무 많은 일이있다 전에 가능한 성능 향상을 알고 싶습니다 때마다 간단한 방법은 플래그를 설정하는 것입니다 물론C 배열의 float 배열에서 효율적인 값 확인

완료하려면 해야합니다.

그래서 데이터가 프레임에서 프레임으로 변경되고 이 검사 후에 uploding을 결정하면 메모리에 의 빠른 검사 (중얼 거림 해시 등)가 발생했습니다. 그래서 질문은, 어떻게 내가 할 수 있었는지입니다. XOR 값의 배열

float vptr [] = {box.x1, box.y1, box.x1, box.y2, box.x2, box.y2, box.x2, box.y1};

함께 값 변화를 확실하게 감지 할 수 있습니까? 당신이 인텔을 사용하는 경우

최저 & 덕분에, 하이너

+1

이것은 캡슐화 **가 중요한 이유입니다. 값이 값을 설정하기 위해 접근자를 제공하는 객체에 저장된 경우 깃발을 추가하면 한 곳에서만 변경해야합니다. –

+0

@PeteBecker 일반적으로 진실입니다. 하지만 동시에 그래픽 코드는 일반적으로 성능에 중대한 영향을 미치므로 속도면에서 니스를 희생해야합니다. 여기에있을 수 있습니다. – Angew

+0

@PeteBecker는 * 읽지 않고 * 답해 주셔서 감사합니다. 질문은 C++ 또는 객체 지향 디자인에 관한 것이 아닙니다. 이 질문은 다른 많은 상황에서 유효합니다. 즉 소수의 수레를 빨리 해시하는 방법은 무엇입니까? –

답변

0

@Ming, 내재적 인 속도 향상을 가져 주셔서 감사합니다. 이것에 대해 살펴 보겠습니다.

float vptr[] = { box.x1,box.y1, box.x1,box.y2, box.x2,box.y2, box.x2,box.y1 }; 
unsigned hashval h = 0; 
for(int i=...) 
{ 
    h ^= (unsigned&) vptr[i]; 
} 

정말 간단한 배열로 작동합니다. 컴파일러는 자동 벡터화 할 수 있어야합니다, 배열의 크기는 알려져 있습니다. 더 큰 배열을 테스트해야합니다. 출처 : Hash function for floats

1

, 당신은 인텔 내장 함수에 볼 수 있었다. http://software.intel.com/en-us/articles/intel-intrinsics-guide은 탐색 할 수있는 대화 형 참조를 제공합니다. 하나의 명령으로 여러 정수 또는 복식을 비교하는 방법에 대한 지침이 있습니다. 이는 빠른 속도 향상입니다.

+0

... 컴파일러에서 인텔 내장 함수를 지원하는 경우 필요한 int intrinsics 패밀리를 지원하면 항상 올바른 헤더를 활성화하고 포함해야합니다. 시각. 컴파일러는 일반적으로 내장 함수를 _builtin functions_와 동일한 수준에 넣습니다. 따라서 내장 함수를 다루기 위해 컴파일러 설명서를 살펴 봐야합니다. – user2485710