Bài 2:
number_list = input("Nhap day so nguyen: ").split()
# Tính tổng số âm chia hết cho 7
sum_negative_divisible_by_7 = 0
for num in number_list:
if int(num) < 0 and int(num) % 7 == 0:
sum_negative_divisible_by_7 += int(num)
print("Tong so am chia het cho 7 la:", sum_negative_divisible_by_7)
# Đưa ra màn hình các số lẻ
print("Cac so le la:")
for num in number_list:
if int(num) % 2 != 0:
print(num, end=" ")
# Đưa ra màn hình tích các số chẵn
product_even_numbers = 1
for num in number_list:
if int(num) % 2 == 0:
product_even_numbers *= int(num)
print("Tich cac so chan la:", product_even_numbers)
c) Có 3 chương trình con
- Tham số hình thức: x1, x2, x
- Tham số thực sự: (b + sqrt(delta))/ (2*a); (b - sqrt(delta))/ (2*a); -b/ (2*a)
- Biến toàn cục: a, b, c, delta
m = int(input("Nhập số phần tử của dãy A: "))
a = []
for i in range(m):
a.append(int(input("Nhập phần tử thứ " + str(i + 1) + ": ")))
# In ra dãy A
print("Dãy A: ", a)
# Đếm số phần tử âm và in ra các số đó
so_am = 0
for num in a:
if num < 0:
so_am += 1
print(num)
print("Số phần tử âm trong dãy A là: ", so_am)
Sau 10 chu kỳ máy, máy tính hoàn thành được 2 x 10 = 20 lệnh (vì mỗi chu kỳ máy có thể xử lý được 2 lệnh).
Để hoàn thành 20 lệnh trong một đường ống 5 giai đoạn, cần thực hiện 20 x 5 = 100 chu kỳ máy.
Sau 20 chu kỳ máy, một đường ống 5 giai đoạn có thể thực hiện được 4 lệnh (tức là 1 lệnh trong mỗi 5 chu kỳ máy), vì một lệnh cần 5 chu kỳ máy để thực hiện.
Để hoàn thành n lệnh trong một đường ống 5 giai đoạn, cần thực hiện n x 5 chu kỳ máy.
Có thể xảy ra hiện tượng nạp thải đường ống
=> Sắp xếp lại để không xảy ra hiện tượng nạp thải
1 - MOV AX, 12h;
2 - MOV BX, 34h;
3 - MOV CX, 56h;
4 - MOV DX, 789h;
5 - ADD AX, BX;
Có 5 giai đoạn cơ bản khi CPU thực hiện một lệnh mã máy:
1. Fetch (nạp lệnh),
2. Decode (giải mã)
3. Execute(thực thi)
4. Memory access (truy cập bộ nhớ)
5. Write-back. (ghi kết quả)
Kỹ thuật xử lý song song mức lệnh (Instruction-level parallelism - ILP) là kỹ thuật tăng tốc độ xử lý bằng cách thực hiện nhiều lệnh cùng một lúc. Kỹ thuật này được thực hiện trên các CPU hiện đại bằng cách sử dụng nhiều đơn vị thực hiện lệnh trong cùng một chu kỳ xung nhịp.
Các kỹ thuật ILP bao gồm:
- Pipelining (đường ống): Tách một lệnh thành nhiều giai đoạn khác nhau và thực hiện các giai đoạn đó cùng một lúc trên nhiều lệnh khác nhau. Kỹ thuật này giúp tăng tốc độ xử lý bằng cách loại bỏ thời gian chờ đợi giữa các lệnh.
- Superscalar processing: Sử dụng nhiều đơn vị thực hiện lệnh cùng một lúc để thực hiện nhiều lệnh khác nhau trong một chu kỳ xung nhịp. Kỹ thuật này tận dụng tốt hơn tài nguyên phần cứng của CPU và cải thiện hiệu suất xử lý.
- Out-of-order execution: Thực hiện các lệnh không theo thứ tự trình tự trong chương trình để tận dụng tối đa tài nguyên phần cứng và loại bỏ thời gian chờ đợi giữa các lệnh.
- Speculative execution: Thực hiện các lệnh dự đoán trước để tối ưu hiệu suất xử lý. Kỹ thuật này được sử dụng trong các CPU hiện đại để tăng tốc độ xử lý và cải thiện hiệu suất của CPU.