2011-11-21 41 views
7

Có cách nào để "vector hóa" việc bổ sung các phần tử trên mảng theo kiểu SIMD không?C# Vectorized Array bổ sung

Ví dụ, tôi muốn chuyển:

var a = new[] { 1, 2, 3, 4 }; 
var b = new[] { 1, 2, 3, 4 }; 
var c = new[] { 1, 2, 3, 4 }; 
var d = new[] { 1, 2, 3, 4 }; 

var e = new int[4]; 

for (int i = 0; i < a.Length; i++) 
{ 
    e[i] = a[i] + b[i] + c[i] + d[i]; 
} 

// e should equal { 4, 8, 12, 16 } 

Into cái gì đó như:

var e = VectorAdd(a,b,c,d); 

tôi biết điều gì đó có thể tồn tại trong các thư viện ++/XNA C, nhưng tôi không biết liệu chúng tôi có nó trong thư viện chuẩn .Net.

Cảm ơn!

+0

Tôi nghĩ rằng các vòng lặp đơn giản như vòng bạn viết được vector hóa bởi trình biên dịch tối ưu hóa. – Tudor

Trả lời

13

Bạn sẽ muốn nhìn vào Mono.Simd:

http://tirania.org/blog/archive/2008/Nov-03.html

Nó hỗ trợ SIMD trong C#

using Mono.Simd; 


//... 
var a = new Vector4f(1, 2, 3, 4); 
var b = new Vector4f(1, 2, 3, 4); 
var c = new Vector4f(1, 2, 3, 4); 
var d = new Vector4f(1, 2, 3, 4); 

var e = a+b+c+d; 
+0

FYI bạn có thể sử dụng lắp ráp nhưng nó sẽ chỉ sử dụng hướng dẫn SIMD nếu nó đang chạy trong CLR mono, nơi có hỗ trợ cho họ. – redcalx

2

Tôi đoán tất cả phụ thuộc vào những gì bạn đang làm, nhưng nếu bạn là lo lắng về việc vector vectơ tổng hợp, bạn có thể muốn xem một thư viện như Math.NET để cung cấp các tính toán số tối ưu.

Từ trang web của họ:

Nó nhắm đến Microsoft .Net 4.0, Mono và Silverlight 4, và thêm vào một thực hiện hoàn toàn được quản lý cũng sẽ hỗ trợ tối ưu hóa phần cứng tự nhiên (MKL, ATLAS).

5

Mono cung cấp API tương đối phong nha (như đề cập của sehe) nhưng nếu Mono không phải là tùy chọn, tôi có thể viết thư viện giao diện C++/CLI để thực hiện việc nâng hạng nặng. C# hoạt động khá tốt cho hầu hết các bộ vấn đề nhưng nếu bạn bắt đầu nhận được vào mã hiệu năng cao, tốt nhất là hãy đến một ngôn ngữ cung cấp cho bạn quyền kiểm soát để thực sự bị bẩn với hiệu năng.

Ở đây tại nơi làm việc, chúng tôi sử dụng P/Gọi để gọi các quy trình xử lý hình ảnh được viết bằng C++ từ C#. P/Invoke có một số chi phí nhưng nếu bạn thực hiện rất ít cuộc gọi và thực hiện rất nhiều quá trình xử lý ở phía gốc thì nó có thể đáng giá.

+0

giây tốt nhất, +1 – sehe

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