2013-03-30 38 views
15

Phần mềm đồ họa 3D của tôi, được viết bằng C# bằng cách sử dụng SlimDX, thực hiện rất nhiều thao tác vectơ trên CPU. (Trong tình huống cụ thể này, bạn không thể tải công việc xuống GPU).Fast Vector Math in .NET - Các tùy chọn là gì?

Làm cách nào để làm cho phép tính vectơ của tôi nhanh hơn? Cho đến nay, tôi đã tìm thấy các phương pháp này:

  • Chạy trên Mono thay vì Microsoft .NET, vì chúng có hỗ trợ SIMD. Không phải là một lựa chọn cho dự án này.
  • SlimGen, một dự án tiêm mã toán học hiệu suất cao khi chạy. Thật không may, dự án vẫn chưa ở trong trạng thái có thể sử dụng được.
  • Viết DLL trong C++ bằng trình biên dịch sử dụng lệnh SSE. Interop với DLL đó từ C#.

Có bất kỳ tùy chọn nào khác để thực hiện phép toán vectơ nhanh hơn trong .NET không?

+19

Làm thế nào là "chủ đề không chính thức" này? Đôi khi bạn có đôi lúc khó chịu. –

+1

Đa luồng (hoặc Open MP) có thể hữu ích. Tôi không biết nếu bạn có thể sử dụng Open MP trên. NET, nhưng tôi muốn giới thiệu một dll bản địa anyway nếu bạn có thể giữ tổng số tiền của p/gọi chức năng gọi thấp. – dialer

+1

Trả lời trễ Tôi biết nhưng bạn có thể muốn xem xét Yeppp!Thư viện SIMD – user9993

Trả lời

0

Trộn .NET với mã gốc. Trong trường hợp này, bạn sẽ cần có một bản phát hành cho x86 và một bản phát hành khác cho x64. Bạn có thể xem Mixed (Native and Managed) Assemblies [MSDN]

8

Viết DLL bằng trình biên dịch Microsoft Visual C++. Sử dụng chuẩn C++ với nội tại SSE và/hoặc OpenMP cho mã số nặng, với #pragma unmanaged. Sử dụng #pragma managed để xác định API C++/CLI sạch mà C# có thể sử dụng.

C++ interop hơi nhanh hơn p/invoke. Và C++/CLI là cách thanh lịch duy nhất để đối phó với cả bộ nhớ thu thập rác và các giả định của các hàm gốc (các khối bộ nhớ sẽ không di chuyển).

Bạn có thể thấy rằng di chuyển một số cuộc gọi OpenGL sang C++ và sử dụng bộ đệm bộ đệm được cấp phát C++ trực tiếp để tải VBO, v.v.

4

Microsoft vừa công bố hỗ trợ tạo hướng dẫn vectơ trong số .NET Native compiler nhờ tối ưu hóa trình biên dịch C++, và quan trọng hơn là hỗ trợ kiểu vector SIMD trong phiên bản JIT mới nhất ("RyuJIT"). Xem một số samples here.

0

Nếu bạn có tâm trạng viết mã lắp ráp trong C#, một tùy chọn khác là dự án NAsmJit, là cổng AsmJit tới C#. Tôi đã không cập nhật nó để phản ánh những thay đổi mới nhất trong dự án đó, nhưng phần lớn hỗ trợ hoàn toàn có thể sử dụng ở lần kiểm tra cuối cùng.

1

diễn biến mới nhất trong .NET bao gồm thư viện vector/ma trận SIMD dành riêng gọi là System.Numerics.Vector:

Using System.Numerics.Vector for Graphics Programming

này sẽ được kích hoạt ngay sau khi JIT mới biên dịch "RyuJIT" sẽ là mặc định, một bản xem trước ở đây:

RyuJIT CTP5: Getting closer to shipping, and with better SIMD support

Vì vậy, rất sớm (hy vọng năm 2015) chúng ta sẽ có vector SIMD rất nhanh trong .NET mà không cần bất kỳ chi phí lập trình.

Các vấn đề liên quan