Sử dụng GPU với c # [đã đóng]


135

Tôi đang cố gắng để có được nhiều sức mạnh xử lý ra khỏi lưới điện của tôi.

Tôi đang sử dụng tất cả các cpus / lõi, có thể sử dụng GPU với C #.

Bất cứ ai cũng biết bất kỳ thư viện hoặc có bất kỳ mã mẫu?

Câu trả lời:


156

[ Chỉnh sửa OCT 2017 vì ngay cả câu trả lời này cũng khá cũ ]

Hầu hết các câu trả lời này khá cũ, vì vậy tôi nghĩ rằng tôi sẽ đưa ra một bản tóm tắt cập nhật về nơi tôi nghĩ mỗi dự án là:

  • GPU.Net (TidePowerd) - Tôi đã thử cách này 6 tháng hoặc lâu hơn và đã làm cho nó hoạt động mặc dù phải mất một chút công việc. Chuyển đổi mã hạt nhân C # thành cuda tại thời gian biên dịch. Thật không may, trang web của họ đã ngừng hoạt động và github của họ đã không được cập nhật trong một vài năm, điều này có thể cho thấy dự án đã chết ....

  • Cudafy - Nguồn mở và rất dễ sử dụng. Chuyển đổi mã hạt nhân C # thành cuda khi chạy (có khả năng tuần tự hóa và bộ đệm). Có thể dễ dàng chạy cùng mã hạt nhân trên CPU (chủ yếu để gỡ lỗi). Hỗ trợ nhiều GPU. Nhiều ví dụ có sẵn hơn những người khác ở đây. Mã soạn sẵn được đề cập bởi các câu trả lời khác là tối thiểu và trong trường hợp của tôi ít nhất cũng giúp tôi hiểu về cách thức hoạt động của mã. Cuda / Nvidia chỉ mặc dù. Thật không may, có vẻ như họ đã không cập nhật giải pháp của họ trong một vài năm nữa (cam kết mới nhất vào năm 2015 - hỗ trợ của cuda 7.0).

  • Lai tạo . Giải pháp thương mại biên dịch C # thành CUDA. Cung cấp một phiên bản cộng đồng miễn phí trên thị trường phòng thu trực quan và các mẫu trên github .

  • AleaGPU Giải pháp thương mại với phiên bản cộng đồng miễn phí cho GPUS tiêu dùng. Xem ý kiến ​​của Daniel để biết chi tiết.

  • Brahma - chạy các biểu thức LINQ thông qua OpenCL (vì vậy cũng hỗ trợ AMD). Không có nhiều tài liệu / ví dụ. Cập nhật lần cuối năm 2011.

  • C $ - sự phát triển cuối cùng đã hơn 10 năm trước ...

  • Microsoft Accelerator - tương tự không có vẻ như nó đang được tích cực phát triển nữa.

  • một số thứ khác ( C ++ AMP , OpenTK - dead / Cloo ) - nhiều trong số này chỉ là các ràng buộc - tức là cho phép bạn gọi GPU từ C #, nhưng mã hạt nhân của bạn (mã thực sự chạy trên GPU) cần phải được viết bằng C hoặc OpenCL, nghĩa là bạn phải sử dụng (và học) ngôn ngữ khác.

Như tôi đã nói, tôi sẽ giới thiệu Cudafy hơn tất cả những người khác - nếu nó có thể chạy trên OpenCL cũng như Cuda thì nó sẽ hoàn hảo.

EDIT SEP 2013 Cudafy hiện cho phép bạn biên dịch cho cả CUDA và OpenCL, do đó sẽ chạy cùng mã C # trên tất cả các GPU. Điều này nghe có vẻ tuyệt vời, mặc dù tôi chưa thử nghiệm biên dịch OpenCL.


31
+1 để cập nhật một câu hỏi hữu ích trong một loại chủ đề phát triển nhanh.
philologon

2
Alea GPU quantalea.com cung cấp hỗ trợ CUDA cho tất cả các ngôn ngữ .NET, hoàn toàn đa nền tảng và mang lại trải nghiệm tốt nhất cho nhà phát triển với việc gỡ lỗi và định hình mã GPU .NET.
Daniel

Hỗ trợ OpenCL trong Cudafy khá tệ - tôi chưa bao giờ quản lý để biên dịch khi dự án của tôi ngày càng lớn. Do đó tôi sẽ gắn bó với OpenCL đơn giản và thực hiện các ràng buộc với C #.
Libor

OpenCL sử dụng Cudafy hoạt động tốt với tôi, đã sử dụng nó trong nhiều năm nay
mcmillab 20/07/2015

Đã thêm liên kết đến các dự án để giúp khách truy cập trong tương lai.
Dan Atkinson


25

Tôi đã tìm thấy Brahma ... Nó cũng có một nhà cung cấp GPGPU cho phép các phương thức chạy trên GPU ... Cảm ơn câu hỏi ... Đã học được điều gì đó mới hôm nay. :)


10

Tôi có thể giới thiệu XNA Game Studio như một con đường khả thi để khám phá không? Nó rõ ràng là hướng đến việc viết các trò chơi, nhưng cung cấp cho bạn quyền truy cập được quản lý vào card đồ họa của bạn và truy cập tốt hơn nhiều vào các chức năng liệt kê khả năng và phát triển shader so với trước đây, Managed DirectX. Ngoài ra còn có cách kết hợp WinForms và XNA vào các ứng dụng lai:

http://www.ziggyware.com/news.php?readmore=866

Bạn sẽ phải nỗ lực học lập trình shader (XNA hỗ trợ HLSL), nhưng đây có thể là một cách tiếp cận đơn giản hơn so với học một giải pháp dành riêng cho nhà cung cấp, chẳng hạn như CUDA của nVidia. Ưu điểm là bạn có thể lập trình trong môi trường được quản lý 100%. Dưới đây là một số liên kết HLSL:

http://www.ziggyware.com/weblinks.php?cat_id=9

Trang web GPGPU cũng là một điểm đến được đề xuất cho lập trình GPU cho mục đích chung:

http://gpgpu.org/

May mắn nhất!


1
Lời chào từ tương lai. Mặc dù có thể là một câu trả lời tốt vào thời điểm đó (tôi đã hiểu về XNA khá nhiều), nhưng thật đáng buồn là XNA hiện không còn tồn tại
MickyD

@MickyD Tuyệt vời Scott! Khi tôi nhảy vào DeLorean của mình và du hành tới năm 2018, tôi hoàn toàn quên cập nhật câu trả lời này! Nếu bạn vẫn quan tâm đến XNA, người kế thừa tinh thần có lẽ là MonoGame đa nền tảng: monogame.net
Dave R.

Cười lớn. Cảm ơn tôi sẽ kiểm tra xem
MickyD

9

Làm thế nào về http://www.tidepowerd.com/ GPU.NET?


2
Tôi thích ý tưởng này, nhưng họ đã ngừng trả lời các câu hỏi hỗ trợ công nghệ khoảng hai năm trước và trang web đã ít nhiều bị ngừng hoạt động trong khoảng một năm, vì vậy tôi nghĩ rằng dự án đã chết. Rõ ràng tác giả là trên SO , mặc dù.
BlueRaja - Daniel Pflughoeft

Tidedpowerd đã dừng sự phát triển của GPU.NET và đóng cửa doanh nghiệp của họ.
Daniel

9

Đây là một cái khác: CUDAfy . Nghe có vẻ như GPU.Net, trong đó một thứ đơn giản như thuộc tính phương thức có thể khiến toàn bộ phương thức chạy trên GPU. Nhưng không giống như GPU.Net, CUDAfy là mã nguồn mở và miễn phí.

GPU.Net dường như không yêu cầu mã soạn sẵn, mặc dù (Theo tài liệu của họ, nó "được tự động chèn bởi công cụ xây dựng") , trong khi CUDAfy thì có.


Dưới đây là một ví dụ về việc xây dựng một ứng dụng với CUDAfy.


8

Chà, đây là một câu hỏi khá cũ, và vì nó đã được hỏi nên mọi thứ đã thay đổi rất nhiều.
Một tùy chọn khác để sử dụng .Net để viết mã GPU, điều mà chưa ai đề cập trong câu trả lời trong Alea GPU . Nó bao gồm C #, F # và VB.

Môi trường phát triển phần mềm GPU chuyên nghiệp cho .NET và Mono. Đa nền tảng thực sự

Trong trang web chính thức của F #, Alea là tùy chọn đầu tiên để sử dụng F # trong lập trình GPGPU.
Để tìm hiểu khuôn khổ này, tôi khuyên bạn nên xem danh sách toàn diện các ví dụ của nó .


1
Chỉ cần nhìn thấy câu trả lời của bạn, sẽ xóa bài viết của tôi. Xem thêm cuộc phỏng vấn Kênh 9 của Seth Juarez tại đây và thẻ SO tại đây )
David Cuccia

@DavidCuccia Công việc tuyệt vời trong việc kiểm tra câu trả lời cũ của bạn. Và cũng cảm ơn vì liên kết kênh 9 (tháng 12 năm 2016!)
Rsh

Tôi nghĩ bạn có nghĩa là bản ghi Kênh 9 này
Daniel

@Daniel Ý tôi là "liên kết đến ghi kênh 9". Đó có phải là mơ hồ? Dù sao, cảm ơn đã chỉ ra.
Rsh

@DavidCuccia xin lỗi vì nhầm lẫn, liên kết rất khó nhìn
Daniel

7

Ngoài Brahma, hãy xem C $ (phát âm là "C Bucks"). Từ trang CodePlex của họ :

Mục đích của [C $] là tạo ra một ngôn ngữ và hệ thống thống nhất để lập trình song song liền mạch trên các GPU và CPU hiện đại.

Nó dựa trên C #, được đánh giá một cách lười biếng và nhắm mục tiêu nhiều mô hình máy gia tốc:

Hiện tại danh sách các kiến ​​trúc dự định bao gồm GPU, CPU đa lõi, Multi-GPU (SLI, CrossFire) và Kiến trúc lai đa CPU + Multi-CPU.


7

Có một giải pháp mới của Microsoft trong thị trấn - C ++ AMP (giới thiệu tại đây ).

Sử dụng từ C # sẽ thông qua P / Invoke, như được demo ở đây cho các ứng dụng trên máy tính để bàn và tại đây cho các ứng dụng Metro (không gọi nó).

Chỉnh sửa: Tôi cần lưu ý rằng C ++ AMP có một đặc tả mở , có nghĩa là nó không nhất thiết chỉ dành cho trình biên dịch MS, hoặc chỉ dành cho Windows.

Chỉnh sửa: Rõ ràng, công nghệ hiện đang ở "chế độ bảo trì", nghĩa là họ đang sửa lỗi, nhưng không tích cực phát triển.


2

Quản lý DirectX bằng cách nào đó, có thể hoạt động


2
Lời chào từ tương lai. Mặc dù có thể là một câu trả lời tốt vào thời điểm đó, nhưng thật đáng buồn là MDX hiện không còn tồn tại khi được thay thế bằng XNA, cũng không còn tồn tại.
MickyD

2

Nếu các GPU của bạn đều là cùng một thương hiệu, bạn có thể nhận được hỗ trợ GPGPU từ nhà cung cấp, thông qua CUDA của Nvidia hoặc Luồng của ATI. AFAIK, họ cung cấp DLL, mà bạn có thể sử dụng thông qua P / Gọi.


1

Phần mềm CenterSpace có tính toán dựa trên GPU trong các thư viện NMath của họ, bạn có thể thêm vào dự án C #. Đó là một sản phẩm thương mại.


0

Nếu bạn định áp dụng thuật toán đại số của riêng mình cần hạt nhân tùy chỉnh:

Gần đây tôi đã tải lên một dự án nguồn mở của tôi vào kho github này sử dụng OpenCL.

Những gì nó làm (bạn cũng có thể kiểm tra từ trang wiki của nó), chọn nhiều thiết bị có khả năng OpenCL và chuỗi hạt nhân từ người dùng và tạo các trình bao bọc mảng C # hoặc C ++ sau đó tính toán bằng cách sử dụng tất cả, với sự trợ giúp của bộ cân bằng tải tự động và một pipeliner (để ẩn độ trễ) để có được hiệu quả tốt từ máy tính.

Dưới đây là một ví dụ về cách sử dụng của nó (1024 workitem được phân vùng cho tất cả các thiết bị, mỗi thiết bị chạy cùng một mã nhưng sử dụng dữ liệu và threadId khác nhau):

// select all GPUs and all CPUs in same pc
ClNumberCruncher gpuCpu = new ClNumberCruncher(AcceleratorType.GPU | AcceleratorType.CPU, @"
    __kernel void distributeTanh(__global float * data,__global int * data2)
    {
         int threadId=get_global_id(0);
         data[threadId]=tanh(data[threadId]);
         data2[threadId]=threadId;
    }    
");

// a wrapper that can hold C# or C++ arrays
ClArray<float> data = new ClArray<float>(1024);
ClArray<int> data2 = new int[1024];

// load-balances "distributeTanh" on all devices more fairly 
// at each repeatation of this line with same compute-id(1 here)
data.nextParam(data2).compute(gpuCpu, 1, "distributeTanh", 1024);
// threadId in kernel receives unique continuous id value for all work
// either it is in cpu or gpu doesn't matter
// compute method also has parameters to enable pipelining to 
// elliminate buffer copy latencies or compute latencies

khi tất cả không được sử dụng nữa, chúng giải phóng tất cả các tài nguyên C ++ bằng các hàm hủy của chúng.

Nhưng nó không chín chắn, vì vậy hãy thoải mái thêm bất kỳ "vấn đề" nào trên tab vấn đề github. Các lớp liên quan nhiều cụm máy tính không hoạt động và chưa được dịch sang tiếng Anh nhưng ít nhất nó có thể sử dụng tất cả các thiết bị trong một máy tính.


-2

WPF cũng sử dụng GPU và bạn có thể thêm các shader tùy chỉnh bằng cách sử dụng HLSL.


Theo hiểu biết của tôi, WPF không có quyền truy cập tính toán GPU GP. Khi nói về WPF System.Windows.Media, nó không phải là DirectX thực sự. Rất chậm khi so sánh với lập trình đỉnh cấp thấp hơn với SharpDX hoặc SlimDX.
Pasi Tuomainen

Tôi đã thêm một liên kết đến một loạt các bài viết về các hiệu ứng tùy chỉnh được tăng tốc GPU trong WPF.
Mark Cidade
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.