5

Tôi tự hỏi liệu có hơn 8 luồng có thể chạy đồng thời trên phần cứng với 8 lõi hay không.đa luồng (openMP) - có bao nhiêu luồng song song

Nếu vậy, sử dụng openMP để song song tính toán N, tôi có thể tạo khối kích thước, N/8 và trong mỗi chuỗi thêm vào (N/8)/8 luồng và có thể vẫn còn nhiều hơn?

Làm thế nào để những điều xảy ra khi tôi lồng nhau song song? thế nào để tôi vẫn còn có 8 chủ đề có sẵn cho song song lồng nhau?

Cảm ơn !!

Trả lời

10

8 lõi chỉ có thể chạy tối đa 8 luồng đồng thời tại một thời điểm nhất định. Tuy nhiên, rất nhiều phụ thuộc vào những gì chủ đề của bạn đang làm. Nếu họ đang làm nhiệm vụ chuyên sâu CPU, nó không được khuyến khích để đẻ trứng nhiều chủ đề nhiều hơn số lượng lõi (một vài có thể OK). Nếu không, việc chuyển đổi bối cảnh và bộ nhớ cache quá mức sẽ làm giảm hiệu suất. Tuy nhiên, nếu có I/O quan trọng, các chủ đề có thể bị chặn rất nhiều, không sử dụng CPU, vì vậy bạn có thể chạy nhiều hơn trong số chúng song song.

Điểm mấu chốt là, bạn cần đo lường hiệu suất trong trường hợp cụ thể của bạn, trên môi trường cụ thể của bạn.

Xem thêm this related thread.

+0

Tôi nghĩ việc xen kẽ có thể có thể xảy ra trong một số trường hợp nhất định tăng tốc độ? Ví dụ, nếu có rất nhiều chờ đợi cho các quá trình nhất định để kết thúc? – ScarletAmaranth

+0

có vẻ như chương trình của tôi nhanh hơn (20%?) Bằng cách sử dụng song song lồng nhau. Tôi không bao giờ thực thi số lượng chủ đề để sử dụng, tôi chỉ đặt omp_set_nested (true) – octoback

+0

@ScarletAmaranth, đúng vậy. I/O là ví dụ điển hình nhất về điều này (do đó tôi đã đề cập đến nó trong câu trả lời của tôi), nhưng cũng có những trường hợp khác. –

0

Trước hết, bạn không thể chạy nhiều hơn 8 chủ đề. Thứ hai, nghỉ mát để lồng nhau song song nếu không có gì khác hoạt động như openmp có để cải thiện rất nhiều trong khía cạnh này.

1

Bộ vi xử lý CPU hiện đại có tùy chọn siêu phân luồng.
Điều này có nghĩa là đường ống có thể chạy hai hoặc nhiều luồng cùng một lúc.

Vì vậy, số lượng các chủ đề có thể chạy đồng thời là:
total_threads = num_procs * hyperthreading yếu tố

Nói chung, các yếu tố hyperthreading = 2.

Đối với một khối lượng công việc chuyên sâu cpu, bạn phải chạy total_threads. Đối với khối lượng công việc chuyên sâu io, bạn nên sử dụng total_threads * 2 luồng. Bằng cách này, chúng ta có thể chồng chéo tính toán của một số luồng với io của các luồng khác.

Các quy tắc ngón tay cái là những gì tôi theo dõi. Bạn có thể thay đổi tùy thuộc vào khối lượng công việc.