Chạy chương trình ở tốc độ CPU thấp hơn?


7

Nó sẽ rất hữu ích đối với tôi để chạy các chương trình cụ thể trong môi trường Linux với tốc độ xung nhịp CPU cố định (thấp hơn) (giả sử, runat 400mhz ./my-program --argument-of="my program"để có được tốc độ xung nhịp đó).

Tôi cần nó để tạo độ trễ giữa mỗi hướng dẫn lắp ráp chương trình của mình và nó sẽ không giết tôi nếu độ trễ không chính xác (giả sử, nếu nó phụ thuộc vào bộ lập lịch của HĐH, vì nó gần như chắc chắn sẽ).

Mục tiêu là làm cho hiệu quả của thuật toán trở nên rất rõ ràng khi lập trình các ứng dụng không quá nặng ở trường (có CPU 3GHz khiến khó nhận thấy các thuật toán chậm chạy trong thời gian ngắn và có thể được tối ưu hóa thực sự). Ngoài ra, nó có thể hữu ích để phát hiện các điều kiện cuộc đua trong thời gian thực, có thể.

Bạn có biết công cụ nào như vậy không? Có loại thông dịch viên nào mà tôi có thể hack để đạt được điều này không? Gdb có thể giúp tôi một cách tương đối dễ dàng không? Tôi nghĩ đó là điều gần nhất để kiểm soát việc thực thi chương trình Linux mà tôi biết.

Chạy hệ thống lỗ trong máy ảo có giới hạn CPU có thể là một tùy chọn khác, do nó cung cấp cho tôi ảo ảnh đó - CPU tốc độ thấp hơn - nhưng hoặc tốt nhất là chạy các chương trình đơn lẻ.


1
Câu trả lời không đầy đủ nhưng bạn có thể xem xét thao tác với cpu.shares thông qua các nhóm. Về cơ bản cấu hình cgroup sau đó chạy chương trình trong cgroup cấu thành thông qua cgexec.
Bratchley

@JoelDavis Tôi không nghĩ bạn có thể làm chậm quá trình thông qua các nhóm. Bạn có thể kiểm soát một lát thời gian CPU nhận được, nhưng nếu đó là quá trình hoạt động duy nhất, nó sẽ nhận được 100% thời gian của CPU.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


5

Tôi nghĩ rằng ứng dụng bạn đang tìm kiếm được gọi cpulimit. Đây không phải là một lệnh thường được bao gồm trong một hệ thống, vì vậy bạn sẽ phải cài đặt nó thông qua trình quản lý gói phân phối (Ubuntu / Debian) hoặc từ nguồn.

Ubuntu / Debian

$ apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process

Vì vậy, cài đặt sẽ như thế này:

$ sudo apt-get install cpulimit

Từ nguồn

Tải về nó như vậy:

$ wget https://github.com/opsengine/cpulimit/archive/master.zip \
       -O cpulimit-master.zip

Giải nén và xây dựng:

$ unzip cpulimit-master.zip ; cd cpulimit-master ; make

Sử dụng

Bạn có thể cài đặt nó với một make install, nhưng bây giờ chúng ta sẽ sử dụng nó từ thư mục nơi chúng ta xây dựng nó:

$ pwd
/home/saml/tst/96387/cpulimit-master
$ src/cpulimit -e firefox -l 30

Điều này sẽ giới hạn quá trình được gọi là firefox30% mức sử dụng CPU có sẵn.

Bạn cũng có thể áp dụng nó cho các quy trình đang chạy sau khi chúng được gọi:

$ pgrep firefox
1234

$ src/cpulimit -p 1234 -l 30

Bạn có thể thấy phần còn lại của việc sử dụng cpulimit:

$ src/cpulimit 
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --ignore-children  don't limit children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <marlonx80@hotmail.com>.

Ngoài ra, có một hướng dẫn tốt về cách sử dụng của nó ở đây trên cyberciti.biz, có tiêu đề: Linux Giới hạn sử dụng CPU trên mỗi quy trình .

LƯU Ý: Hãy nhớ rằng nó giới hạn mức sử dụng CPU theo tỷ lệ phần trăm vì vậy nếu bạn có hộp lõi tứ (4 cpus) thì bạn sẽ cần giới hạn từ 0% - 400%.


1

Bạn có thể đặt đồng hồ của bộ xử lý, nhưng trên toàn cầu, không phải cho một chương trình cụ thể. Bộ xử lý không hoạt động theo cách này. Bộ xử lý dành cho môi trường hạn chế năng lượng (đặc biệt là máy tính xách tay và các thiết bị di động khác) có xu hướng hỗ trợ nhiều tốc độ.

Về nguyên tắc, bạn có thể sắp xếp để thay đổi tốc độ bộ xử lý (nếu được hỗ trợ) khi quy trình của bạn được lên lịch và đặt lại tốc độ bộ xử lý khi quy trình khác được lên lịch. Tôi không biết về bất kỳ phần mềm nào hỗ trợ điều đó, có lẽ nó sẽ yêu cầu một sửa đổi khá lớn đối với kernel.

Bạn có thể chạy chương trình của mình bên trong một máy ảo chậm, chẳng hạn như Qemu (không có KVM, để bạn có được mô phỏng phần mềm thuần túy) hoặc Bochs.

Chạy ở tốc độ CPU thấp hơn không có khả năng để lộ nhiều điều kiện cuộc đua hơn.

Nếu chương trình của bạn là đa luồng, bạn có thể buộc nó sử dụng một bộ xử lý hoặc một bộ xử lý cụ thể taskset, ví dụ như taskset 3 myprogramchỉ chạy trên CPU # 0 và # 1. Buộc chương trình chạy trên một CPU có khả năng xuất hiện ít điều kiện cuộc đua hơn.

Đối với trường hợp sử dụng của bạn, thay vì chạy chương trình của bạn chậm hơn, hãy chạy nó nhiều lần. Ví dụ: nếu bạn dự định chương trình của mình có tốc độ nhất định trên các thiết bị chậm hơn khoảng 10 lần so với máy tính của bạn, hãy kiểm tra nó bằng cách chạy chương trình của bạn 10 lần liên tiếp. Chạy chương trình nhiều lần sẽ tăng khả năng chạy trong điều kiện cuộc đua.


Hãy xem trang người đàn ông cho taskset. Bạn cũng có thể bảo nó chạy trên cpus cụ thể bằng cách sử dụng công -ctắc. taskset -c 0,2,4-11 myprogram.
slm

1

Một lựa chọn khác là sử dụng một phần cứng chậm - một số loại rẻ tiền board ARM-based như Raspbery Pi hoặc (hơi mạnh hơn) CompuLab Trimslice nên làm. Họ đã có một bộ nhớ hạn chế, CPU chậm nhưng vẫn có thể chạy một hệ thống Linux đầy đủ - Fedora, Debian và một vài bản phân phối khác có phiên bản ARM.


0

Mục tiêu là làm cho hiệu quả của thuật toán trở nên rõ ràng khi lập trình các ứng dụng không quá nặng

Cách chuẩn để làm điều này là lặp lại quá trình nhiều lần. Nếu bạn có hai thuật toán khác nhau thực hiện cùng một nhiệm vụ X (không quá nặng) và bạn muốn điểm chuẩn chúng, bạn có thời gian chúng lặp lại nhiệm vụ X một nghìn hoặc một triệu lần. Điều này có thể yêu cầu bạn viết một chương trình đơn giản (mức cao) để lái điểm chuẩn; miễn là cùng một chương trình trình điều khiển chạy tất cả các bài kiểm tra, bạn sẽ có được một so sánh thực tế về mức độ nhanh của cái này so với cái kia.


Mặc dù sự thật là điểm chuẩn là cách chính thức để thực hiện - đây là học thuật. Tôi đang chỉnh sửa câu hỏi của mình để làm rõ điều này. Cảm ơn câu trả lời của bạn.
mgarciaisaia

0

Bạn có thể sử dụng cpufreq-thông tin để tra cứu tất cả tốc độ xung nhịp CPU được hỗ trợ bởi cpu của bạn. Và bạn có thể sử dụng cpufreq-set để chọn tốc độ xung nhịp cpu.


0

Chỉ cần chạy chương trình của bạn dưới valgrind . Bạn có thể sẽ nhận được một hit hiệu suất 50 ×.

Như một phần thưởng mặc dù và điều này có vẻ phù hợp với trường hợp sử dụng của bạn, bạn có thể thuyết phục valgrind cung cấp cho bạn biểu đồ cuộc gọi, thông tin hồ sơ, nhiều nội dung hay khác nhau như lỗi sử dụng bộ nhớ, v.v.

Bằng cách lấy ví dụ,

$ valgrind --tool=callgrind --separate-callers=30 ./a.out

sẽ tạo một tệp callgrind.out . Bạn có thể xem dữ liệu lược tả này bên trong kcachegrind , một gui khá hay.

Nhắc nhở: tất cả các hồ sơ nói dối. Bạn phải hiểu hồ sơ của bạn để có thể đánh giá mức độ sai sự thật.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.