2013-05-27 3 views
3

현재 SSE 사용으로 많은 이점을 얻을 수있는 C#의 응용 프로그램을 코딩하고 있습니다. 상대적으로 작은 코드로 인해 실행 시간이 90-95 %가됩니다. 코드 자체는 SSE (매트릭스 및 벡터 기반)에서도 완벽하므로 Mono.Simd를 사용하기 시작했습니다. 실행 시간에 상당한 차이가 있었지만 여전히 충분하지 않습니다. Mono.Simd의 문제점은 매우 오래된 SSE 명령 (주로 SSE1 및 SSE2에 기반한 것으로 생각합니다)이 있기 때문에 dotproduct (또는 스칼라/내부 제품)가 예를 들어 3 개의 명령을 처리하도록 만듭니다. SSE4는 단 1 개의 명령어로 구현됩니다. (2006 년부터 SSE4를 사용할 수 있기 때문에 모든 현대 컴퓨터가 SSE4를 사용할 수 있다고 가정 할 수 있습니다). 또한, 다른 함수들의 묶음은 전혀 포함되지 않습니다. (예를 들어, 모든 숫자의 절대 값을 얻습니다. 또한 어색한 해결 방법이 필요합니다).C#에서 SSE 사용

내 질문은 내 C# 코드 내에서 SSE/SIMD를 사용하도록 호출 할 수있는 다른 라이브러리가 있습니까? C#에서 인라인 어셈블리를 사용하는 것도 가능합니다. 따라서 C++ 코드를 사용할 수도 있지만, 성능이 약간 떨어지더라도 말입니다. 그렇지만이 함수를 사용하여 비교적 쉽게 사용할 수있는 C++ 라이브러리가 있으면 허용 될 수 있습니다. 그렇 겠지.

미리 도움을 청하십시오.

+1

C++/CLI로 클래스 라이브러리를 만듭니다. #pragma unmanaged in effect로 컴파일 된 코드에서 SSEx 내장 함수를 사용할 수 있습니다. 그러나 단일 SSE4 명령어를 효율적으로 사용할 수는 없으며 관리 코드에서 비 관리 코드 실행으로 전환하는 데 오버 헤드가 발생합니다. 약 5 나노 초가 소요되며 인수를 마샬링하는 데 필요한 오버 헤드와 변수를 16 개로 정렬해야하는 필연적 인 복사본이 필요합니다. 네이티브 코드는 해당 비용을 상환 할만큼 충분히 커야합니다. –

+2

"2006 년부터 SSE4를 사용할 수 있기 때문에 현재 모든 컴퓨터에 지금까지있는 모든 컴퓨터가 있다고 가정 할 수 있습니다."- Penryn (Intel)은 2008 년 1 월이었고 Bulldozer (AMD)는 2011 년 10 월이었습니다. SSE2에 대한 대체 기능이 없다면 인텔과 AMD의 경우이 날짜보다 오래된 모든 CPU에서 충돌합니다. – Asik

+0

opencl 래퍼를 사용할 수 있습니다. –

답변

11

오픈 소스 Yeppp! library (이 중 저자는)은 SIMD에 최적화 된 데이터 처리 기능을 제공하며 .Net 언어에서 공식 바인딩을 통해 사용할 수 있습니다. SSE는 물론 향후 출시 될 Intel Haswell 프로세서에서 AVX2까지의 SIMD 확장을 지원합니다. 라이브러리는 실행되는 프로세서에 맞는 최적의 버전을 자동으로 선택합니다.

+0

이것은 정말로 유망 해 보입니다. 어떻게하면 코드에서 사용할 수 있습니까? (단일성 프로젝트에서 Mono에서 C#을 사용하고 있기 때문에 둘 다 실행할 수 있다면 좋을 것입니다. Windows 및 Mac)? dll이 있습니까, 아니면 MacOS에서 사용할 수 있으며 모든 최적화 (또는 대부분의 최적화)를 사용할 수 있습니까? –

+0

이것은 Linux의 Mono (Windows의 경우 .Net)에서 작동하지만 Mac은 현재 지원되지 않습니다. –

+0

최신 공식 릴리스를 다운로드하면 바이너리 디렉토리 –

2

2013 년 4 월 기준 Steam Survey reports that only 64% of PCs have support for SSE4.1. 다시 말해, SSE4.1 지원을 가정하면 전체 소비자 PC의 약 1/3이 충돌하게됩니다.

Mono.Simd에 익숙하지 않지만 Windows에서 좋은 대안은 DirectXMath입니다. 적절한 C++/CLI 래퍼를 작성할 수 있다면 귀찮은 문제입니다. 어느 쪽도 최신 지침을 모두 활용하지는 않지만 intrinsics을 통해 쉽게 필요에 따라 보완 할 수 있습니다. 당신이 Mono.Simd보다 훨씬 더 잘 할 수 있을지 확신하지 못합니다.

C#에는 "인라인 어셈블리"와 같은 것이 없습니다. C#에서 C++ 또는 어셈블리 코드를 사용하려면 P/Invoke 또는 C++/CLI 래퍼를 통해 호출해야합니다. 두 가지 중에서 C++/CLI는 오버 헤드가 적습니다.

즉, 작은 코드 조각을 최적화해야하는 경우 최선의 방법은 네이티브 C++에서 해당 코드 부분을 완전히 다시 작성하는 것입니다.

+0

이제 크게 바뀌 었습니다 :) (고맙게도) – JeromeJ