2011-10-12 4 views
4

현재 네트워크 코딩을위한 Java 기반 라이브러리 (http://en.wikipedia.org/wiki/Network_coding)를 개발 중입니다. 이것은 매우 CPU 집약적이므로 인코딩 단계를 최적화하는 데 도움이 필요합니다. 내가 본질적으로하고있는 것은 원래 데이터의 덧셈 연산이 XOR이고 곱셈 연산이 갈루아 필드 곱셈 (GF (2^16)에서)의 랜덤 - 선형 조합을 만들고 있다는 것입니다.네트워크 코딩 인코딩 성능 향상

나는 최적화가 가능할 때까지 왔습니다. 예를 들어, 다음과 같은 트릭을 사용하고 있습니다 : http://groups.google.com/group/comp.dsp/browse_thread/thread/cba57ae9db9971fd/7cd21eec39ddae1a?hl=en&lnk=gst&q=Sarwate+Galois#7cd21eec39ddae1a 곱셈을 더 빠르게 만듭니다.

따라서이 문제를 더욱 최적화하는 방법에 대한 도움말을 찾고 있습니다. 내가 사용한 프로파일 러가 조작이 가장 비용이 많이 드는 (예 : 배열 조회 또는 XOR) 힌트를 제공하지 않기 때문에 프로파일 링하기가 어렵습니다. 그래서 나는 무작위로 다른 아이디어를 시험해보고 전반적인 성능을 향상시키는 지 테스트 할 시점입니다.

은 더 구체적으로 내가에 도움이 필요 개선의 일부 발생할 수있는 영역은 다음과 같습니다

  • 이 어떻게 자바 경계를 검사 건너 뛸 수있는 배열 작업에 있는지 확인 할 수 있습니까?
  • HotSpot의 최적화가 완료된 후 실제로 실행되는 바이트 코드를 어떻게 검색 할 수 있습니까?

다음은 알고리즘의 핵심입니다. 문맥을 이해하는 것이 어려울 수도 있지만 불필요하게 값 비싼 작업이 있으면 직접 알려주십시오!

int messageFragmentStart = 0; 
int messageFragmentEnd = fragmentCharSize; 

int coefficientIndex = fragmentID * messageFragmentsPerDataBlock; 
final int resultArrayIndexStart = fragmentID * fragmentCharSize; 

for (int messageFragmentIndex = 0; messageFragmentIndex < messageFragmentsPerDataBlock; messageFragmentIndex++) { 
    final int coefficientLogValue = coefficientLogValues[coefficientIndex++]; 
    int resultArrayIndex = resultArrayIndexStart; 
    for (int i = messageFragmentStart; i < messageFragmentEnd; i++) { 
     final int logSum = coefficientLogValue + logOfDataToEncode[i]; 
     final int messageMultipliedByCoefficient = expTable[logSum];       
     resultArray[resultArrayIndex++] ^= messageMultipliedByCoefficient; 
    } 
    messageFragmentStart += fragmentCharSize; 
    messageFragmentEnd = Math.min(messageFragmentEnd + fragmentCharSize, maxTotalLength); 
} 

답변

2

Java가 JLS에서 지정된대로 경계 검사를 수행하도록 만들 수 없습니다. 그러나 대부분의 경우 JIT는 범위 검사가 간단하면 (예 : i < array.length)이를 피할 수 있습니다. 그렇지 않으면 피할 수있는 방법이 없습니다. (안전하지 않은 개체를 사용할 수 있다고 가정합니다.)

여기 두 번째 문제는 여기에 this입니다.이 부분은 목적을 잘 수행해야합니다.

어쨌든 코드에서이 문제가 벡터화하는 것이 간단하고 슬프게도 JVM이 그다지 잘하지 않는다는 것/전혀 없습니다. 따라서 컴파일 내장 함수 (ICC/GCC의 자동 벡터 라이 제이션을 시도 할 수도 있음)를 사용하여 c/C++에서 동일한 코드를 구현하면 상당히 큰 속도 향상을 초래할 수 있습니다. 그래서 C++로 구현하고 참조 용으로 JNI를 사용합니다.

+0

감사합니다. PrintAssembly를 사용해 보았지만 다음과 같은 오류 메시지가 나타납니다. "hsdis-amd64.dll을로드 할 수 없으며 라이브러리를로드 할 수 없으며 PrintAssembly가 비활성화되었습니다." 이 DLL을 어디서 얻을 수 있는지에 대한 생각은? – Yrlec

+0

신경 쓰지 마라. JDK 7 (x86)으로 변경하고 http://classparser.blogspot.com/2010/03/hsdis-i386dll.html에서 해당 DLL을 찾았습니다. – Yrlec