2011-12-07 51 views
34

Có cách nào hay công cụ nào để áp dụng tăng tốc GPU khi biên dịch chương trình bằng trình biên dịch GCC? Ngay bây giờ tôi đã tạo ra một chương trình để biên dịch danh sách các chương trình được lặp lại. Phải mất một vài phút. Tôi biết một vài chương trình như Pyrit giúp áp dụng tăng tốc GPU cho băm precomputing.Có thể sử dụng tăng tốc GPU khi biên dịch nhiều chương trình trên trình biên dịch gcc không?

Nếu không có sẵn các công cụ như vậy, hãy tư vấn về việc có nên sử dụng OpenCL hay bất kỳ thứ gì khác để lập trình lại mã của tôi không.

+1

Thay vì không rõ ràng, ít nhất là với tôi. Bạn đang tìm kiếm một trình biên dịch tự động "tăng tốc GPU" mã của bạn hay trình biên dịch tăng tốc GPU? – unwind

+11

Tôi khá chắc chắn anh ấy có nghĩa là một trình biên dịch tăng tốc GPU. – RCE

+0

Tôi khá nghi ngờ rằng việc biên dịch sẽ được hưởng lợi từ việc chạy trên GPU. Bạn có thể cụ thể hơn về (1) những gì bạn đang cố gắng để thực hiện và (2) những gì bạn đã làm để xác định các nút cổ chai trong quá trình hiện tại của bạn. – dmckee

Trả lời

25

A. Trong ngôn ngữ lập trình bắt buộc, các câu lệnh được thực thi theo thứ tự và mỗi câu lệnh có thể thay đổi trạng thái của chương trình. Vì vậy, việc phân tích các đơn vị dịch thuật vốn đã được tuần tự.

Một ví dụ: Kiểm tra ra cách tuyên truyền liên tục có thể làm việc -

a = 5; 
b = a + 7; 
c = a + b + 9; 

Bạn cần phải đi qua các báo cáo liên tục trước khi bạn tìm ra rằng các giá trị được gán cho bc là hằng số tại thời gian biên dịch.

(khối cơ bản Tuy nhiên riêng biệt có thể có thể được biên dịch và tối ưu hóa song song với nhau.)

B. Ngày đầu này, đèo khác nhau cần phải thực hiện tuần tự là tốt, và ảnh hưởng lẫn nhau.

Ví dụ: Dựa trên lịch biểu hướng dẫn, bạn cấp phát sổ đăng ký, khi đó bạn thấy rằng bạn cần phải đăng ký bộ nhớ, vì vậy bạn cần tạo hướng dẫn mới. Điều này thay đổi lịch trình một lần nữa.

Vì vậy, bạn không thể thực hiện 'lượt' như 'đăng ký phân bổ' và 'lập lịch' song song (thực tế, tôi nghĩ rằng có những bài viết mà các nhà khoa học/nhà toán học đã cố gắng giải quyết hai vấn đề này với nhau, nhưng cho phép không đi vào đó).

(Một lần nữa, người ta có thể đạt được một số song song bởi pipelining đi.)

Hơn nữa, GPU đặc biệt là không phù hợp vì:

  1. GPU là tốt vào thời điểm toán học nổi. Trình biên dịch không cần hoặc sử dụng nhiều (trừ khi tối ưu hóa số học dấu phẩy động trong chương trình)

  2. GPU ở SIMD tốt. tức là thực hiện cùng hoạt động trên nhiều đầu vào. Đây là một lần nữa, không phải cái gì một trình biên dịch cần phải làm. Có có thể là một lợi ích nếu trình biên dịch cần, tối ưu hóa hàng trăm hoạt động điểm nổi (Ví dụ hoang dã sẽ là: lập trình viên xác định một số mảng lớn FP, gán hằng số cho chúng, và sau đó viết mã để hoạt động trên các . một chương trình rất nặng bằng văn bản thực sự.)

Vì vậy, ngoài việc parallelizing biên soạn các khối cơ bản và pipelining trôi qua, không có nhiều lý song song là ở mức độ 'trong biên soạn của một tập tin C' . Nhưng song song là có thể, dễ thực hiện, và liên tục được sử dụng ở một mức độ cao hơn. Ví dụ: GNU Make, có đối số -j=N.Điều này về cơ bản có nghĩa là: miễn là tìm được N các công việc độc lập (thường là biên dịch một tập tin là gì), nó sinh ra các quy trình N (hoặc N các thể hiện song song gcc biên dịch các tệp khác nhau).

+4

Bạn dường như gợi ý rằng việc biên dịch không thể song song được; các dự án như [distcc] (http://en.wikipedia.org/wiki/Distcc) dường như là bằng chứng rõ ràng ngược lại. Parallizing biên dịch là thực hành tiêu chuẩn những ngày này. Bất kể, tôi không nghi ngờ rằng việc tăng tốc biên dịch GPU có thể vẫn không khả thi - có nhiều yếu tố hạn chế như thông lượng xe buýt, v.v. –

+5

@FrankFarmer - Tôi không chắc liệu bạn có đọc toàn bộ câu trả lời của tôi hay không. Tôi đã không sử dụng 'distcc', nhưng một cái nhìn tại [* this *] (http://distcc.googlecode.com/svn/trunk/doc/web/index.html) cho tôi thấy rằng' distcc' chạy ở * tệp * độ chi tiết. Nó xử lý trước các nội dung trên máy chủ và gửi toàn bộ tệp đến máy chủ để xử lý. tức là mỗi tệp tin của chính nó vẫn được biên dịch một cách serially. Đây là mức độ chi tiết tương tự * như GNU Thực hiện với tùy chọn '-j'. – ArjunShankar

+0

@FrankFarmer - Nếu bạn nhìn vào đoạn cuối cùng trong câu trả lời, bạn sẽ thấy nơi 'distcc' phù hợp. – ArjunShankar

7

NẾU những gì bạn đang hỏi là "Bạn có thể tự động viết mã tăng tốc GPU để sử dụng với GCC và LLVM không?" câu trả lời là có. NVIDIA và Google làm cho mã nguồn mở dự án biên dịch LLVM dựa trên:

NVIDIA CUDA LLVM:

GOOGLE GPUCC:

Nếu câu hỏi của bạn là "Tôi có thể sử dụng GPU để tăng tốc độ biên dịch mã chung không phải CUDA không?" câu trả lời hiện tại là không. GPU là tốt ở những thứ nhất định như nhiệm vụ song song, xấu ở những người khác như chi nhánh mà trình biên dịch là tất cả về. Tin tốt là, bạn có thể sử dụng mạng máy tính với CPU để có tốc độ biên dịch 2-10x, tùy thuộc vào cách tối ưu hóa mã của bạn và bạn có thể có CPU đa nhân nhanh nhất và SSD tốc độ cao có sẵn cho máy tính để bàn của bạn để có được lợi nhuận cho ít rắc rối trước khi bạn sử dụng để xây dựng mạng.

Có các công cụ để phân phối tác vụ trình biên dịch C/C++/ObjC tới mạng máy tính như Distcc. Nó đã được bao gồm trong các phiên bản cũ của XCode nhưng đã được gỡ bỏ, và không có hỗ trợ cho việc sử dụng nó với Swift.

Có một công cụ thương mại tương tự như Distcc Documentation gọi Incredibuild hỗ trợ Visual Studio C/C++ và môi trường phát triển Linux:

Có một số bài viết hay về việc sử dụng Incredibuild vs Distcc và trad trong thế giới thực eoffs so với hỗ trợ xây dựng gia tăng trong trình biên dịch bản địa để thực hiện các thay đổi nhỏ như một dòng trong một tệp duy nhất mà không biên dịch lại mọi thứ khác. Các điểm cần xem xét:

  • Bạn có thể tăng tốc độ một cơ sở mã đáng kể bởi tiêu đề trước khi biên soạn, sử dụng nhiều DLL, và sử dụng gia tăng xây dựng dựa trên một máy duy nhất. Incredibuild là một giải pháp hoàn chỉnh hơn để tự động phân phối công việc và đảm bảo kết quả tương tự như một biên dịch nối tiếp so với làm miễn phí với distcc, nơi bạn phải làm nhiều công việc hơn cho cùng một kết quả và khả năng tương thích với bất kỳ thứ gì ngoài gcc .
  • Để xem xét chi tiết, hãy xem http://gamesfromwithin.com/how-incredible-is-incredibuild
Các vấn đề liên quan