2012-03-13 25 views
5

Giả sử một máy đơn có 8 lõi. Trong Haskell, bạn có thể biên dịch bằng cách sử dụng tùy chọn threaded, sau đó trong khi sử dụng thời gian chạy +RTS -Nx để chỉ định số lượng lõi được sử dụng. ví dụ.Cách thực hiện các phép đo F # để tăng tốc độ

$ myprg args // sequential run 
$ myprg args +RTS -N1 // parallel run on 1..8 cores 
$ myprg args +RTS -N2 
$ myprg args +RTS -N4 
$ myprg args +RTS -N8 

Từ đó, bạn có thể sử dụng số lượng lõi ngày càng tăng, sau đó bạn có thể sử dụng để tăng tốc và vẽ biểu đồ.

Bạn sẽ làm điều này như thế nào trong F #, giả sử tôi có một chương trình song song, ví dụ: sử dụng một bản đồ song song trong mã?

EDIT: tôi thấy có ParallelOptions ví dụ MaxDegreeOfParallelismcó thể là những gì tôi cần nhưng không chắc chắn về hành vi chính xác của nó và tôi sẽ phải sử dụng nó theo cách lập trình. 'hoặc chủ đề.

CHỈNH SỬA: ProcessorAffinity thực sự giới hạn số lượng lõi để sử dụng nhưng có vẻ như nó không được triển khai đúng cách trong Mono. Tôi đã kiểm tra trên Windows và có vẻ như nó hoạt động. Mặc dù nó không thực sự là một ý tưởng tốt để sử dụng. Hệ thống thời gian chạy sẽ có thể quyết định tốt hơn cách quản lý và lên lịch các tác vụ. Ngoài ra, MaxDegreeOfParallelism là về "mức độ song song" về cơ bản đặt số lượng tác vụ được tạo, do đó có thể được sử dụng để thay đổi mức độ chi tiết.

+2

Nếu bạn đang sử dụng Windows, bạn chỉ có thể đặt số lượng CPU trong trình quản lý tác vụ: http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an -ứng dụng-trong-windows/ –

+0

Tôi đang sử dụng Linux/mono. Có cách nào để làm điều tương tự trong Linux? – vis

+6

F # xây dựng một phiên bản .NET gốc. Một hội đồng theo các quy tắc quy định cho thời gian chạy (CLR) mà theo mặc định có ái lực trên tất cả các lõi CPU. Bạn có thể giới hạn CLR cho một số _fewer_ lõi bằng cách đặt 'System.Diagnostics.Process.GetCurrentProcess(). ProcessorAffinity'. – bytebuster

Trả lời

2

F # tạo bản dựng .NET gốc. Một hội đồng theo các quy tắc quy định cho thời gian chạy (CLR) mà theo mặc định có ái lực trên tất cả các lõi CPU. Bạn có thể giới hạn CLR cho số lượng ít hơn bằng cách đặt System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

Câu trả lời này có vẻ không đầy đủ đối với môi trường Mono. ProcessorAffinity giá trị is a bit mask, vì vậy 0 chắc chắn là một điều kiện không hợp lệ. Tôi cũng tự hỏi tại sao setter đã không ném một ngoại lệ như mô tả trong MSDN.

Tôi sẽ sử dụng schedutils để kiểm tra mối quan hệ Mono và cũng kiểm tra xem cờ môi trường MONO_NO_SMP chưa được đặt hay chưa.

2

Để báo giá bình luận của bytebuster:

F # tạo bản dựng .NET gốc. Một hội đồng theo các quy tắc quy định cho thời gian chạy (CLR) mà theo mặc định có ái lực trên tất cả các lõi CPU. Bạn có thể giới hạn CLR cho số lõi ít ​​hơn bằng cách đặt System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity.

(Nếu bạn thêm câu trả lời để lại nhận xét và tôi sẽ xóa câu trả lời này)

+0

Bạn có thể đánh dấu câu trả lời là một wiki cộng đồng (nếu bạn không phải là tác giả gốc). –

+0

@TomasPetricek: Xong – Guvante

+0

Tôi đã cố gắng sử dụng 'ProcessorAffinity' nhưng dường như nó không tạo ra bất kỳ sự khác biệt nào khi chạy một chương trình song song trên máy có 8 lõi. Tôi hy vọng thiết lập ái lực với 1,2,4,8 sẽ tăng tốc độ nhưng không phải như vậy. Các runtimes vẫn giữ nguyên, như thể thiết lập thuộc tính này không tạo ra bất kỳ sự khác biệt nào. Bất kỳ lý do nào tại sao điều này có thể xảy ra? Sau khi xem tài liệu trong msdn, tôi có xu hướng nghĩ rằng nó áp dụng cho bộ xử lý vật lý và không phải lõi xử lý. – vis

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