2012-02-19 27 views
9

Tôi đang tự hỏi những gì các chi phí thực hiện một cuộc gọi CUDA hạt nhân là trong C/C++ như sau:Hiệu suất phạt khi gọi một CUDA kernel

somekernel1<<<blocks,threads>>>(args); 
somekernel2<<<blocks,threads>>>(args); 
somekernel3<<<blocks,threads>>>(args); 

Lý do tại sao tôi yêu cầu này là do Ứng dụng tôi đang xây dựng hiện đang thực hiện các cuộc gọi lặp lại thành nhiều hạt nhân (không nhớ đọc lại/ghi vào thiết bị giữa các cuộc gọi) và tôi tự hỏi nếu gói các hạt nhân này vào một cuộc gọi hạt nhân (với somekernel1-3 trở thành các chức năng của thiết bị) sẽ tạo nên sự khác biệt có ý nghĩa về hiệu suất.

Trả lời

13

Chi phí phía máy chủ lưu trữ khi khởi chạy hạt nhân uaing API thời gian chạy chỉ khoảng 15-30 micro giây trên nền tảng Windows không phải WDDM. Trên các nền tảng WDDM (mà tôi không sử dụng), tôi hiểu nó có thể cao hơn rất nhiều, cộng với có một số loại cơ chế định lượng trong trình điều khiển cố gắng phân bổ chi phí bằng cách thực hiện nhiều thao tác trong một thao tác bên trình điều khiển đơn.

Nói chung, sẽ có sự gia tăng hiệu suất trong việc "hợp nhất" nhiều hoạt động dữ liệu, nếu không sẽ được thực hiện trong các nhân riêng biệt thành một hạt nhân duy nhất, nơi các thuật toán cho phép. GPU có hiệu năng cao hơn nhiều so với băng thông bộ nhớ đỉnh, vì vậy FLOPs nhiều hơn có thể được thực hiện trên mỗi giao dịch bộ nhớ (và mỗi mã kernel), hiệu năng của hạt nhân càng tốt. Mặt khác, cố gắng viết một kernel kiểu "swiss knife knife" cố gắng nhồi nhét các hoạt động hoàn toàn khác nhau thành một đoạn mã không bao giờ là một ý tưởng tốt, bởi vì nó làm tăng áp suất đăng ký và giảm hiệu quả của những thứ như L1, bộ nhớ liên tục và bộ đệm kết cấu.

Cách bạn chọn nên thực sự được hướng dẫn bởi bản chất của mã/thuật toán. Tôi không tin rằng có một câu trả lời "chính xác" cho câu hỏi này có thể được áp dụng trong mọi trường hợp.

+0

Cách tiếp cận dao quân đội Thụy Sĩ là thứ tôi đang cố gắng tránh làm để duy trì sự chia sẻ của các hạt nhân này giữa các dự án. Cảm ơn phản ứng, tôi chỉ muốn đảm bảo rằng không có một số vấn đề hiệu suất điên mà tôi đã không nhận thức được khi thực hiện nhiều cuộc gọi cuda. – NothingMore

+1

Lưu ý: trên WDDM, nếu bạn đang sử dụng GPU Tesla, bạn có thể sử dụng trình điều khiển Tesla Compute Cluster (TCC) để mang hiệu suất phù hợp với các nền tảng không phải WDDM như XP hoặc Linux. Với câu hỏi ban đầu, tôi sẽ nhấn mạnh: nếu kết hợp các hạt nhân giúp giảm thiểu sự chuyển giao PCI-express, nó có thể đáng giá. Nếu không, thì ít nhất hãy chắc chắn rằng bạn chồng chéo tính toán của Kernel1 với chuyển đến GPU dữ liệu cho Kernel2, v.v. – harrism

+0

talonmies nền tảng Windows không phải WDDM bạn đang nói đến là gì? winXP? Im rất quan tâm vì hình phạt WDDM là HUGE và tôi không thể siwtch cho Linux. Sử dụng bằng win7 x64 và sẽ cần nền tảng x64 (vấn đề RAM) – Dredok

1

Nếu bạn đang sử dụng Visual Studio Pro trên Windows, tôi cho rằng bạn chạy ứng dụng thử nghiệm bằng cách sử dụng Parallel NSight của NVidia, tôi nghĩ nó có thể cho bạn biết dấu thời gian từ cuộc gọi phương thức đến thực thi thực sự. , nhưng nó sẽ không đáng kể nếu hạt nhân của bạn kéo dài đủ lâu.

+0

Tôi không chạy trên các cửa sổ (RHEL 6.0, Tesla C2075). – NothingMore

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