2010-06-21 41 views
5

Xin lỗi vì câu hỏi chủ đề mơ hồ, nhưng tôi đang nghiên cứu một số quy trình xử lý video học thuật. Các thuật toán được viết bằng MATLAB, và trong khi nó tốt cho mục đích phát triển, nó xử lý một video ở khoảng 60spf, hoặc xung quanh .0166fps. Không cần phải nói, điều này sẽ không đủ cho trình diễn và như vậy, vì vậy công việc mùa hè của tôi là chuyển đổi thói quen thành thứ gì đó sẽ chạy nhanh hơn đáng kể.Giải pháp tốt nhất cho vấn đề song song đáng xấu hổ là gì?

Tôi đã viết lại phần chậm nhất của mã cho CUDA, giải pháp GPGPU của nvidia. Tuy nhiên, đó cũng là một phần lớn của mã mà dường như được thực hiện tốt hơn trên CPU, vì nó tương đối nối tiếp. Vấn đề là, máy tôi đã được cung cấp có 2 bộ vi xử lý Xeon, với tổng số 8 lõi logic, và nó có vẻ là một sự xấu hổ để tắc nghẽn mã GPU bằng cách mã hóa chỉ cho lõi đơn. Quá trình chuyển đổi video có chức năng trong mỗi khung hình không phụ thuộc vào các khung hình khác, vì vậy tôi đã suy nghĩ một số loại hàng đợi/luồng không đồng bộ sẽ tốt nhất.

Đây là câu hỏi của tôi: cách tốt nhất để đạt được loại song song này với tỷ lệ nỗ lực tốt nhất để tăng tốc độ sản lượng là gì?

Một số giải pháp mà tôi đã xem xét là OpenMP, .net TPL và pthread đơn giản.

Tôi chỉ có tiếp xúc cơ bản với lập trình không đồng bộ, vì vậy tôi muốn sử dụng thư viện hoặc một thứ gì đó thay vì lộn xộn xung quanh với mutexes và rào cản và tự bắn mình vào chân nhiều lần. Tôi không ngại học, bởi vì đó là một trong những mục tiêu của tôi cho mùa hè này, nhưng đồng thời, song song là cứng. Tuy nhiên, nếu sự khác biệt về tốc độ thực sự rất đáng chú ý, tôi sẵn sàng kéo tóc ra trong vài tuần. : P

Xin cảm ơn trước.

+0

Nếu bạn có thể giải quyết vấn đề thành nhiều phần có thể được thực hiện mà không bị nhiễu (với các điểm đồng bộ được xác định rõ), thì "thư viện" được sử dụng chỉ là đường ... một cách đơn giản là sử dụng thread pool, hàng đợi đồng thời (một cho đầu vào, một cho đầu ra), và chỉ truy cập các đối tượng/dữ liệu mà thread "sở hữu" (điều này có thể được mở rộng đến các cấu trúc bên ngoài bất biến). –

Trả lời

3

Nếu tối đa hóa nỗ lực mang lại là mục tiêu của bạn, tôi khuyên bạn nên xem xét TPL trong .NET. Đây có lẽ là cách đơn giản nhất để thực hiện điều này. Tùy thuộc vào những gì mã của bạn đang làm, bạn có thể tạo thành một đường ống hoặc thậm chí sử dụng Parallel.For (hoặc ForEach) trên mỗi "khung".

Điều đó đang được nói, nếu bạn muốn dính vào mã nguồn gốc không được quản lý, một tùy chọn tốt có thể là Parallel Patterns Library hoặc Intel's Threading Building Blocks mới của Microsoft. Cả hai đều có cấu trúc tương tự với TPL mới, đặc biệt là cho dữ liệu song song, và sẽ làm cho điều này khá dễ dàng để song song, miễn là "mỗi khung không phụ thuộc vào các khung khác" vẫn đúng.

+0

Đánh tôi với nó! Ade Miller đã có một cuộc nói chuyện tốt tại TechEd về các tùy chọn song song có sẵn với .Net 4.0: http://www.msteched.com/2010/NorthAmerica/ARC205 – Mathias

+0

PPL có vẻ giống như những gì tôi đã tìm kiếm, cảm ơn. Một câu hỏi mặc dù, không sử dụng mã được quản lý như C# làm chậm mã như tôi đáng chú ý, nơi mà nó chủ yếu là số học dấu chấm động trên mảng lớn? Tôi thích môi trường lập trình đơn giản hơn nhiều, nhưng với những thứ như xử lý video, tôi luôn do dự vì lo ngại về việc thu gom rác và kiểm tra chi phí bị ràng buộc. Có thể chỉ là hoang tưởng lập trình C cũ: \ – Xzhsh

+0

Xzhsh: Cá nhân tôi sử dụng C# và mã được quản lý để xử lý dữ liệu khoa học trong "công việc ban ngày" của tôi. Nó rất tốt, nhưng sự hoàn hảo. đặc điểm khác với mã gốc - vì vậy bạn phải thích ứng với suy nghĩ của mình để bù đắp. Tôi sẽ không, cá nhân, lo lắng về GC là một vấn đề, nhưng mảng giới hạn kiểm tra có thể làm chậm bạn xuống (điều này có thể được vô hiệu hóa). Tuy nhiên, trong hầu hết các trường hợp, hồ sơ cẩn thận và mã được quản lý "tốt" có thể dẫn đến mã nhanh (và thường nhanh hơn) so với mã gốc. –

1

Lời khuyên của tôi sẽ là tiếp cận vấn đề này theo cách thức từng bước.

  1. Trước tiên, hãy chứng minh rằng bạn có triển khai không thực hiện chức năng MATLAB. Điều này là không tầm thường và, thẳng thắn, tôi nghĩ bạn nên lập kế hoạch chi 100% chu kỳ não của bạn nhận được sự chính xác trước khi bạn nghĩ về hiệu suất.

  2. Phân vùng giải pháp của bạn: chứng minh rằng bạn có thể thực hiện thường trình mà bạn cho là được tách rời khỏi phần còn lại của việc triển khai và cách ly nó theo cú pháp từ phần còn lại của mã. Ví dụ, nếu bạn đang nói về một người theo dõi tia, bạn có thể tính toán kết quả từ một điểm nhìn duy nhất chụp một tia qua một điểm ảnh duy nhất vào môi trường chung. Điều này cũng không tầm thường vì nó sẽ yêu cầu bạn suy nghĩ về những gì thực sự phổ biến (ví dụ, hình học của môi trường, bản đồ kết cấu, vv) và cái gì là cụ thể cho một tình huống duy nhất (ví dụ, tia từ mắt đến pixel) . Hồ sơ hiệu suất là bạn của bạn ở đây.

  3. Xác định cú pháp của thư viện hoặc khung mà bạn quan tâm sẽ được yêu cầu tạo luồng/quy trình song song, khởi chạy chúng và tham gia kết quả sau khi hoàn thành. Lưu ý: bạn sẽ cần phải loại trừ lẫn nhau trên dữ liệu được chia sẻ, v.v. Ví dụ: trong thế giới Java, điều này sẽ là java.util.concurrency.

  4. Thử tạo hai (chỉ hai) chuỗi để phân chia công việc của bạn làm đôi. Viết tiêu chuẩn cho phép bạn đo giải pháp ban đầu của bạn, giải pháp cho N = 2 chủ đề và cấu hình địa ngục ra khỏi kết quả.

  5. Chỉ sau đó bạn thậm chí nên nghĩ đến việc song song hơn nữa.

Nếu bạn làm theo các bước như thế này, bạn sẽ (a) thành công ở nhiệm vụ thực tế của bạn (cổng từ MATLAB), (b) có một cái gì đó mà làm việc với một số số liệu hiệu suất nổi tiếng và (c) có một rõ ràng con đường phía trước nếu bạn muốn khai thác thêm các cơ hội parallization.

+0

Cảm ơn bạn đã tip Bob! Tôi đã chuyển các thói quen qua phần lớn là C và tính song song sẽ chỉ nằm giữa các khung hoàn toàn độc lập. Tôi thích lời khuyên của bạn và chắc chắn sẽ ghi nhớ cho dự án tiếp theo của tôi – Xzhsh

+0

@Xzhsh, FYI, trong đồ hoạ của riêng tôi, tính song song tốt nhất thực sự là trên mỗi khung chứ không phải chỉ định toàn bộ khung độc lập cho bộ xử lý riêng lẻ . Môi trường chia sẻ mạnh mẽ thúc đẩy phân vùng các điểm ảnh cho các chủ đề khác nhau và đẩy nhanh quá trình tính toán của một khung hình duy nhất (sau đó tất cả là một raytracer). Lựa chọn phương pháp tiếp cận có lẽ là một chủ đề hay khác để bạn điều tra như một phần của dự án. –

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