2013-05-01 4 views
-1

일부 int64 산술 연산에 대한 최적화를 시도하고 있습니다. 오른쪽 및 왼쪽 교대, 나누기, 나머지 및 모든 opoe와 같은 작업을 수행해야합니다. 모든 SSE 내장 함수를 검색 했으므로 아무 것도 발견하지 못했습니다. 왼쪽 교대는 음의 값으로 잘 작동하지 않습니다. Pls는 나를 안내 할 수 있습니까 ??SSE int64 내장 함수

코드의 일부가 (인텔 I7에) 표시됩니다 :

u_a2b2=(MatrixAiB1[0]>>2*z_bits); 
res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits)); 
if (MatrixAiB1[0] >= 0)       
    { 
    if (abs(res_ri) > (__int64(1)<<41))  
    {   
     u_a2b2=u_a2b2+1; 
    } 
    } 
else 
{ 
    if (abs(res_ri) < (__int64(1)<<41))  
    { 
     if (u_a2b2>=0) 
     { 
     u_a2b2=u_a2b2-1; 
     } 
     else 
     { 
     u_a2b2=u_a2b2+1; 
     } 
     } 

} 

모든 것이

감사

+1

안녕하세요. 서면으로 귀하의 질문은 조금 번쩍입니다. 당신이 원하는 한 가지 일을 시도하는 완전하고 그러나 최소한의 프로그램을 게시 할 수 있다면 그것이 도움이 될 것입니다. –

+1

달성하고자하는 목표와 개선하려는 목표를 명확히 구분하는 것이 멀습니다. 코드 자체는 배열이나 그런 식으로 작동하지 않는 것 같습니다. 따라서 64 비트 빌드 코드의 경우 SSE 명령어의 도움이 전혀 없습니다. (대개 속도가 느려질 수 있습니다). 32 비트 빌드의 경우 SSE 명령은 교대로 약간 더 빠를 수 있습니다 (나누기 또는 모듈로는 동일한 속도입니다. 어려운 부분은 실제 나누기이므로 동일한 나누기 단위에서 발생합니다. SSE 또는 "보통"지시). –

+0

어쨌든 SSE에는 정수 나머지 (또는 심지어 정수 나누기)가 없습니다. – harold

답변

4

정직을 INT64되어, 이런 종류의 최적화를 위해 노력 이유가 없다 암호. 그냥 64 비트 크기의 변수를 선언하고 컴파일러가 나머지를하도록하십시오. 64 비트 빌드에서 생성 된 명령어는 모두 CPU 고유 (즉 단일 CPU 명령어)이며 32 비트 빌드에서는 컴파일러 작성자가 이미 32 비트에서 64 비트 연산을 구현하는 가장 좋은 방법을 찾는 데 열심히 노력했습니다. bit 시스템입니다.

+1

+1 : 가장 중요한 요점을 되풀이하기 위해서 :'g ++ -m64' (또는 컴파일러에 상응하는 것)로 컴파일하여 64 비트 코드를 생성하십시오. –

0

이 비트 :

res_ri=(MatrixAiB1[0] % (__int64(1)<<2*z_bits)); 

아마로 대체 할 수있다 :

res_ri=(MatrixAiB1[0] & (__int64(1)<<2*z_bits)-1); 

(결과가 음성 또는 양성이 될 것으로 예상되는 경우, 해당를 해결하기 위해 뭔가를해야합니다, %의 변 중 하나가 음수이면 "구현"이 정의되어 있으므로 MatrixAiB1[0]이 0보다 작 으면 어떤 일이 발생하지 않아야합니다.

& 작업은 %보다 약 20 배 빠르므로 5000 요소에 대해 약 100000 클록 사이클을 개선해야합니다.

+0

예, 가능합니다. 컴파일러가이 트릭을 알고 있다는 간단한 이유 때문에 런타임을 향상시키기 위해 아무 것도하지 않을 것입니다. (그리고이 경우 항상 피연산자가 2의 거듭 제곱임을 증명할 수 있습니다. 컴파일러가 어쨌든 할 수 있어야하는 일을함으로써 코드를 읽기 쉽게 만들어야 할 이유가 없어야합니다. 그리고 비록 그것이 실행되지 않는다고해도 if-condition의 예측 가능성에 따라 많은 향상을 제공하지 않을 수도 있습니다 (물론 시퀀스가 ​​조건부 이동으로 대체되는 점프로 완전히 재정렬되지 않는다고 가정 할 때). – Grizzly

0

64 비트 정수 처리를위한 SSE2와 AVX2 내장 함수가 많이 있습니다. 프로세서가 AVX2를 지원한다면 한 번에 4 개의 64 비트 값을 처리하여 코드 속도를 향상시킬 수 있습니다 ...

여기에 꽤 많은 목록이 있습니다 : https://software.intel.com/sites/landingpage/IntrinsicsGuide/.