2010-11-07 54 views
29

Tôi không có kiến ​​thức về các khái niệm và API lập trình GPU. Tôi có một vài câu hỏi:Chạy mã C# trên GPU

  1. Có thể viết một đoạn mã C# được quản lý và biên dịch/dịch nó thành một loại mô-đun nào đó, có thể thực thi trên GPU không? Hoặc tôi phải chịu số phận để có hai triển khai, một cho quản lý trên CPU và một cho GPU (Tôi hiểu rằng sẽ có những hạn chế về những gì có thể được thực hiện trên GPU)?
  2. Có tồn tại API phong nha và trưởng thành để lập trình độc lập với các nhà cung cấp phần cứng GPU khác nhau (tức là API chung) không?
  3. Có cách nào hay nhất nếu muốn phát triển các ứng dụng chạy trên CPU, được viết bằng ngôn ngữ được quản lý và cũng cung cấp tối ưu hóa tốc độ nếu có phần cứng GPU phù hợp?

Tôi cũng sẽ rất vui vì các liên kết tới bất kỳ loại tài liệu nào có tài nguyên học tập phù hợp.

nhất, Jozef

+4

Mã cấp thấp nhất được viết bằng ngôn ngữ cấp thấp. Không có lý do chính đáng để làm điều này trong C# khi có lựa chọn thay thế tốt hơn. –

+0

xem câu hỏi tương tự này: http://stackoverflow.com/questions/375011/utilizing-the-gpu-with-c-sharp – mcmillab

Trả lời

21

1) Không - không phải cho các trường hợp chung của C# - rõ ràng là bất cứ điều gì có thể được tạo ra cho một số tập con của ngôn ngữ

2) Có - HLSL sử dụng Direct X hoặc Open GL

3) không thường càng tốt - CPU và GPU mã hóa cơ bản khác nhau

về cơ bản bạn không thể nghĩ ra CPU và GPU mã hóa như là tương đương. GPU là một công cụ xử lý song song chuyên dụng cao - cho nhiều phép tính đơn giản song song.

Cố gắng viết một chương trình tổng quát chung trong GPU với nhiều nhánh, v.v. sẽ không hiệu quả - thậm chí không thể.

Kiến trúc truy cập bộ nhớ của chúng hoàn toàn khác nhau.

Bạn nên viết cho CPU nhưng trang trại tính toán song song thích hợp cho GPU.

+7

-1 vì không đề cập đến OpenCL hoặc DirectCompute. – Euphoric

+7

Ouch - đau quá :) –

+1

-1: OpenGL sử dụng ngôn ngữ đánh bóng GLSL không phải là ngôn ngữ bóng của HLSL –

2

1) Không phải là tôi biết, nhưng có thể có một thư viện cho C# có thể giúp bạn.

2) OpenCL. Nó độc lập với GPU và thậm chí có thể chạy trên CPU.

3) OpenCL sẽ giúp bạn với điều đó, bạn có thể biên dịch cho CPU quá với OpenCL, mặc dù tôi không chắc chắn làm thế nào tuyệt vời của mã nó làm cho CPU. Tôi đã thực sự yêu OpenCL gần đây, nó hoạt động thực sự rất tốt.

17

1) Không, không phải cho trường hợp chung của C#, nhưng là một tập con nhỏ, có. Hoặc thông qua một thời gian chạy (kiểm tra Tidepowerd GPU.NET) hoặc thông qua hỗ trợ ngôn ngữ (LINQ hoặc Mã báo giá).

2) Có, DirectCompute (DX11 Compute Shaders) và OpenCL là cả hai nhà cung cấp độc lập, API trưởng thành và bạn có thể tìm thấy .NET ràng buộc cho chúng.

3) Không, như James đã nói, chúng là những con thú khác nhau. GPU là bộ xử lý độ trễ cao được tối ưu hóa cho các ứng dụng song song dữ liệu thông lượng cao trong khi CPU là bộ xử lý độ trễ thấp được tối ưu hóa cho các ứng dụng mục đích chung tuần tự.

Dự án nghiên cứu duy nhất mà tôi biết cố giải quyết vấn đề này là ngôn ngữ SPAP.

Lời khuyên của tôi, đừng cố gắng tìm API/thời gian chạy phổ biến hoàn hảo vì không có. Chọn công nghệ hiện có (DirectCompute hoặc OpenCL) và xem cách bạn có thể tận dụng công nghệ đó cho doanh nghiệp của mình.

Liên kết hữu ích cho bắt đầu:

+0

liên kết đến tidepowered đã chết, đây là một trong để git https://github.com/tidepowerd/GPU.NET-Example-Projects –

2

Ngoài ra còn có brahma. Nó được cho là chụp các biểu thức và biên dịch chúng cho GPU. Tôi đã không cố gắng bản thân mình.

Và, Microsoft có một mẫu thử nghiệm được gọi là accelerator, tương tự như mục tiêu nhưng khác biệt về cú pháp.

-1

Đối với Java, xem dự án Aparapi (https://github.com/aparapi/aparapi). Điều này cho phép một tập hợp con của Java được chạy trên bất kỳ GPU nào hỗ trợ OpenCL. Bytecode của các lớp Kernel được biên dịch chéo trong thời gian chạy tới mã OpenCL. Có những hạn chế nghiêm trọng đối với mã java có thể được biên dịch chéo - về cơ bản không có đối tượng nào có thể được sử dụng như các trường, địa phương hoặc phương thức args. Tuy nhiên, lợi thế khổng lồ là các hạt nhân có thể được thực hiện trong Java hoặc OpenCL (với dự phòng tự động để thực thi Java ThreadPool trong trường hợp không có thiết bị GPU/APU thích hợp). Điều này nghe giống như điều gần nhất với những gì bạn đang tìm kiếm trong phần 3 của câu hỏi của bạn (mặc dù tất nhiên ngôn ngữ được quản lý không phải là C#).

Tôi không biết bất kỳ điều gì tương tự trong C#.

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