การใช้ GPU กับ c # [ปิด]


136

ฉันพยายามดึงพลังการประมวลผลออกจากกริดมากขึ้น

ฉันใช้ cpus / cores ทั้งหมดเป็นไปได้ไหมที่จะใช้ GPU กับ C #

มีใครรู้จักห้องสมุดหรือมีโค้ดตัวอย่างบ้างไหม

คำตอบ:


160

[ แก้ไขตุลาคม 2017 แม้ว่าคำตอบนี้จะค่อนข้างเก่า ]

คำตอบเหล่านี้ส่วนใหญ่ค่อนข้างเก่าดังนั้นฉันคิดว่าฉันจะให้ข้อมูลสรุปที่อัปเดตว่าฉันคิดว่าแต่ละโครงการอยู่ที่ไหน:

  • GPU.Net (TidePowerd) - ฉันลองใช้งานเมื่อ 6 เดือนที่แล้วและใช้งานได้แม้ว่าจะใช้งานเล็กน้อย แปลงรหัสเคอร์เนล C # เป็น cuda ในเวลาคอมไพล์ น่าเสียดายที่เว็บไซต์ของพวกเขาหยุดทำงานและ github ของพวกเขาไม่ได้รับการอัปเดตเป็นเวลาสองสามปีซึ่งอาจบ่งบอกว่าโครงการนั้นตายแล้ว ....

  • Cudafy - โอเพ่นซอร์สและใช้งานง่ายมาก แปลงรหัสเคอร์เนล C # เป็น cuda ที่รันไทม์ (พร้อมความสามารถในการทำให้เป็นอนุกรมและแคช) สามารถรันโค้ดเคอร์เนลเดียวกันบน CPU ได้อย่างง่ายดาย (ส่วนใหญ่ใช้สำหรับการดีบั๊ก) รองรับ GPU หลายตัว มีตัวอย่างมากกว่าที่อื่น ๆ ที่นี่ รหัสต้นแบบที่อ้างถึงโดยคำตอบอื่นนั้นมีน้อยมากและในกรณีของฉันอย่างน้อยก็ช่วยให้ฉันเข้าใจวิธีการทำงานของโค้ด Cuda / Nvidia เท่านั้น น่าเสียดายที่ดูเหมือนว่าพวกเขาไม่ได้อัปเดตโซลูชันของพวกเขามาสองสามปีแล้วด้วย (ข้อผูกพันล่าสุดในปี 2015 - รองรับ cuda 7.0)

  • Hybridizer โซลูชันเชิงพาณิชย์ที่รวบรวม C # ถึง CUDA ให้ชุมชน Edition ฟรีในตลาดสตูดิโอภาพและตัวอย่างบนGitHub

  • โซลูชันเชิงพาณิชย์ของAleaGPUพร้อมรุ่นชุมชนฟรีสำหรับผู้บริโภค GPUS ดูความคิดเห็นของ Daniel สำหรับรายละเอียด

  • Brahma - รันนิพจน์ LINQ ผ่าน OpenCL (รองรับ AMD ด้วย) เอกสาร / ตัวอย่างไม่มาก อัปเดตล่าสุดในปี 2554

  • C $ - การพัฒนาครั้งล่าสุดเมื่อ 10 กว่าปีที่แล้ว ...

  • Microsoft Accelerator - ดูเหมือนจะไม่ได้รับการพัฒนาอย่างแข็งขันอีกต่อไป

  • อื่น ๆ บางส่วน ( C ++ AMP , OpenTK - dead / Cloo ) - ส่วนใหญ่เป็นเพียงการผูก - เช่นช่วยให้คุณสามารถเรียก GPU จาก C # ได้ แต่ต้องเขียนโค้ดเคอร์เนลของคุณ (โค้ดที่รันบน GPU) C หรือ OpenCL หมายความว่าคุณต้องใช้ (และเรียนรู้) ภาษาอื่น

อย่างที่ฉันพูดไปฉันจะแนะนำ Cudafy ให้กับคนอื่น ๆ ทั้งหมด - ถ้ามันสามารถทำงานบน OpenCL ได้เช่นเดียวกับ Cuda มันจะสมบูรณ์แบบ

แก้ไข SEP 2013 Cudafy ตอนนี้ให้คุณคอมไพล์สำหรับทั้ง CUDA และ OpenCL ดังนั้นจะเรียกใช้รหัส C # เดียวกันบน GPU ทั้งหมด ฟังดูดีมากแม้ว่าฉันจะยังไม่ได้ทดสอบการคอมไพล์ OpenCL


33
+1 สำหรับการอัปเดตคำถามที่เป็นประโยชน์ในหัวข้อที่มีการพัฒนาอย่างรวดเร็ว
philologon

2
Alea GPU quantalea.comให้การสนับสนุน CUDA สำหรับภาษา. NET ทั้งหมดเป็นข้ามแพลตฟอร์มอย่างสมบูรณ์และมอบประสบการณ์ที่ดีที่สุดให้กับนักพัฒนาซอฟต์แวร์ด้วยการดีบักและการสร้างโปรไฟล์ของรหัส. NET GPU
Daniel

การสนับสนุน OpenCL ใน Cudafy ค่อนข้างแย่ - ฉันไม่เคยรวบรวมได้เลยเมื่อโครงการของฉันขยายใหญ่ขึ้น ดังนั้นฉันจะใช้ OpenCL ธรรมดาและทำการผูกกับ C #
Libor

OpenCL โดยใช้ Cudafy ใช้งานได้ดีสำหรับฉันใช้มาหลายปีแล้ว
mcmillab

1
ILGPU ( ilgpu.net ): คอมไพเลอร์ GPU ที่ทันสมัยน้ำหนักเบาและรวดเร็วสำหรับโปรแกรม. Net ประสิทธิภาพสูง นั่นฟรี! ILGPU เผยแพร่ภายใต้ใบอนุญาตโอเพนซอร์สของมหาวิทยาลัยอิลลินอยส์ / NCSA ILGPU เป็นโครงการฟรีและไม่ได้รับการสนับสนุน กำลังได้รับการพัฒนาโดยนักพัฒนาคอมไพเลอร์ GPU และคอมพิวเตอร์กราฟิกที่เป็นมืออาชีพและหลงใหล สนับสนุนโครงการด้วยการบริจาคหรือการบริจาคเล็กน้อยเพื่อเร่งกระบวนการพัฒนาและเพื่อให้โครงการคงอยู่ต่อไป
DanOver

46

Microsoft Research Acceleratorเป็นไลบรารี. NET GP GPU


นั่นเป็นโครงการที่ยอดเยี่ยมพร้อมนโยบายการออกใบอนุญาตที่ไม่ดี น่าเสียดายที่ไม่มีให้บริการที่ไซต์ MS อีกต่อไป ...
ForNeVeR

25

ฉันพบพรหม ... และยังมีผู้ให้บริการ GPGPU ที่อนุญาตให้วิธีการทำงานบน GPU ... ขอบคุณสำหรับคำถาม ... เรียนรู้สิ่งใหม่ ๆ วันนี้ :)


10

ฉันขอแนะนำ XNA Game Studio เป็นช่องทางสำหรับการสำรวจได้ไหม เห็นได้ชัดว่าเหมาะสำหรับการเขียนเกม แต่ช่วยให้คุณสามารถเข้าถึงกราฟิกการ์ดของคุณได้และสามารถเข้าถึงฟังก์ชั่นการระบุความสามารถและการพัฒนา shader ได้ดีกว่าที่เคยมีอยู่ใน Managed DirectX นอกจากนี้ยังมีวิธีการรวม WinForms และ XNA เข้ากับแอปพลิเคชันไฮบริด:

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

คุณจะต้องใช้ความพยายามในการเรียนรู้การเขียนโปรแกรม shader (XNA รองรับ HLSL) แต่นี่อาจเป็นวิธีที่ง่ายกว่าการเรียนรู้โซลูชันเฉพาะสำหรับผู้ขายเช่น CUDA ของ nVidia ข้อดีคือคุณสามารถตั้งโปรแกรมในสภาพแวดล้อมที่มีการจัดการ 100% นี่คือลิงค์ HLSL บางส่วน:

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

ไซต์ GPGPU ยังเป็นจุดหมายปลายทางที่แนะนำสำหรับการเขียนโปรแกรม GPU สำหรับวัตถุประสงค์ทั่วไป:

http://gpgpu.org/

ขอให้โชคดี!


1
คำทักทายจากอนาคต แม้ว่าจะเป็นคำตอบที่ดีในเวลานั้น (ฉันขลุกอยู่กับ XNA ไม่น้อย) แต่ XNA ก็น่าเศร้าที่ตอนนี้เสียชีวิต
MickyD

@MickyD เกรทสก็อต! เมื่อฉันกระโดดเข้าสู่ DeLorean และเดินทางต่อไปยังปี 2018 ฉันลืมอัปเดตคำตอบนี้โดยสิ้นเชิง! หากคุณยังสนใจ XNA ผู้สืบทอดจิตวิญญาณน่าจะเป็น MonoGame ข้ามแพลตฟอร์ม: monogame.net
Dave R.

ฮ่า ๆ. ขอบคุณฉันจะตรวจสอบให้
MickyD

9

แล้วhttp://www.tidepowerd.com/ GPU.NET ล่ะ?


2
ฉันชอบไอเดียนี้ แต่พวกเขาหยุดตอบคำถามเกี่ยวกับการสนับสนุนด้านเทคนิคเมื่อสองปีที่แล้วและไซต์ก็หยุดทำงานมากขึ้นหรือน้อยลงเป็นเวลาประมาณหนึ่งปีดังนั้นฉันคิดว่าโครงการนี้ตายไปแล้ว เห็นได้ชัดว่าผู้เขียนใช้ SOแม้ว่า
BlueRaja - Danny Pflughoeft

Tidedpowerd หยุดการพัฒนา GPU.NET และปิดกิจการ
Daniel

9

นี่เป็นอีกคนหนึ่ง: CUDAfy ดูเหมือน GPU.Net ในสิ่งที่ง่ายอย่างเช่น method-attribute อาจทำให้เมธอดทั้งหมดทำงานบน GPU แต่แตกต่างจาก GPU.Net CUDAfy ฟรีและโอเพ่นซอร์ส

ดูเหมือนว่า GPU.Net จะไม่ต้องการรหัสสำเร็จรูป(ตามเอกสารของพวกเขามัน "ถูกแทรกโดยอัตโนมัติโดยเครื่องมือสร้าง")ในขณะที่ CUDAfy ทำ


นี่คือตัวอย่างของการสร้างแอปพลิเคชันด้วย CUDAfy


8

นี่เป็นคำถามที่ค่อนข้างเก่าและเนื่องจากมีการถามสิ่งต่างๆจึงเปลี่ยนไปมาก
ตัวเลือกสำหรับการใช้ NET เพื่อเขียนโค้ด GPU ซึ่งไม่มีใครได้กล่าวถึงในคำตอบในอีกAlea GPU ครอบคลุม C #, F # และ VB

สภาพแวดล้อมการพัฒนาซอฟต์แวร์ GPU ระดับมืออาชีพสำหรับ. NET และ Mono ข้ามแพลตฟอร์มอย่างแท้จริง

ในเว็บไซต์อย่างเป็นทางการของ F # Alea เป็นตัวเลือกแรกสำหรับการใช้ F # ในการเขียนโปรแกรม GPGPU
เพื่อทำความรู้จักกับกรอบงานนี้ฉันขอแนะนำให้ดูรายการตัวอย่างที่ครอบคลุม


1
เพิ่งเห็นคำตอบของคุณจะลบโพสต์ของฉัน ดูบทสัมภาษณ์ช่อง 9 โดย Seth Juarez ที่นี่และ SO tag ที่นี่ )
David Cuccia

@DavidCuccia เยี่ยมมากในการตรวจสอบคำตอบเก่าของคุณ และขอบคุณสำหรับลิงค์ช่อง 9 (ธันวาคม 2559!)
Rsh

ฉันคิดว่าคุณหมายถึงการบันทึกช่อง 9
Daniel

@ แดเนียลฉันหมายถึง "ลิงก์ไปยังการบันทึกช่อง 9" มีความคลุมเครือหรือไม่? อย่างไรก็ตามขอบคุณที่ชี้ให้เห็น
Rsh

@DavidCuccia ขออภัยในความสับสนลิงก์หาดูยาก
Daniel

7

นอกจากพรหมแล้วลองดูC $ (ออกเสียงว่า C Bucks) จากไซต์ CodePlex ของพวกเขา:

จุดมุ่งหมายของ [C $] คือการสร้างภาษาและระบบที่เป็นหนึ่งเดียวสำหรับการเขียนโปรแกรมแบบขนานที่ราบรื่นบน GPU และ CPU สมัยใหม่

มันขึ้นอยู่กับ C # ประเมินอย่างเฉื่อยชาและกำหนดเป้าหมายรุ่นเร่งความเร็วหลายรุ่น:

ขณะนี้รายชื่อสถาปัตยกรรมที่ต้องการ ได้แก่ GPU, ซีพียูแบบหลายคอร์, Multi-GPU (SLI, CrossFire) และสถาปัตยกรรมไฮบริดแบบ Multi-GPU + Multi-CPU


7

มีโซลูชันใหม่ของ Microsoft ในเมือง - C ++ AMP (แนะนำที่นี่ )

การใช้งานจาก C # จะเป็นผ่าน P / Invoke ตามที่สาธิตไว้ที่นี่สำหรับแอพเดสก์ท็อปและที่นี่สำหรับแอพ Metro (ไม่เรียกมัน)

แก้ไข:ฉันควรทราบว่า C ++ AMP มีข้อกำหนดแบบเปิดซึ่งหมายความว่าไม่จำเป็นต้องมีไว้สำหรับคอมไพเลอร์ MS หรือสำหรับ Windows เท่านั้น

แก้ไข:เห็นได้ชัดว่าเทคโนโลยีอยู่ใน "โหมดการบำรุงรักษา"ซึ่งหมายความว่ากำลังแก้ไขข้อบกพร่อง แต่ไม่ได้พัฒนาอย่างจริงจัง


2

DirectX ที่มีการจัดการอาจใช้งานได้


2
คำทักทายจากอนาคต แม้ว่าเนื้อหาจะเป็นคำตอบที่ดีในเวลานั้น แต่น่าเศร้าที่ MDX ได้ถูกแทนที่ด้วย XNA ซึ่งก็หมดอายุเช่นกัน
MickyD

2

หาก GPU ของคุณเป็นยี่ห้อเดียวกันทั้งหมดคุณอาจได้รับการสนับสนุน GPGPU จากผู้จำหน่ายไม่ว่าจะผ่าน CUDA ของ Nvidia หรือสตรีมของ ATI AFAIK มี DLL ซึ่งคุณสามารถใช้ผ่าน P / Invoke



0

หากคุณกำลังจะใช้ algortihms ของคุณเองที่ต้องการเมล็ดที่กำหนดเอง:

ฉันเพิ่งอัปโหลดโครงการโอเพ่นซอร์สของฉันไปยังที่เก็บ githubซึ่งใช้ OpenCL

มันทำอะไร (คุณสามารถตรวจสอบได้จากหน้า wiki ด้วย) คือเลือกอุปกรณ์ที่รองรับ OpenCL หลายเครื่องและสตริงเคอร์เนลจากผู้ใช้และสร้าง C # หรือ C ++ array wrapper จากนั้นคำนวณโดยใช้ทั้งหมดโดยใช้ auto-load-balancer และ a pipeliner (เพื่อซ่อนเวลาแฝง) เพื่อให้ได้ประสิทธิภาพที่ดีจากพีซี

นี่คือตัวอย่างของการใช้งาน (1024 รายการงานที่แบ่งพาร์ติชันไปยังอุปกรณ์ทั้งหมดแต่ละรายการใช้รหัสเดียวกัน แต่ใช้ข้อมูลและ threadId ต่างกัน):

// 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

เมื่อไม่ได้ใช้งานอีกต่อไปพวกเขาจะปล่อยทรัพยากร C ++ ทั้งหมดพร้อมกับผู้ทำลายของพวกเขา

แต่ยังไม่เป็นผู้ใหญ่ดังนั้นอย่าลังเลที่จะเพิ่ม "ปัญหา" ใด ๆ ในแท็บปัญหาของ github คลาสที่เกี่ยวข้องกับคลัสเตอร์หลายชิ้นไม่ทำงานและยังไม่ได้รับการแปลเป็นภาษาอังกฤษ แต่สามารถใช้อุปกรณ์ทั้งหมดในพีซีเครื่องเดียวได้เป็นอย่างน้อย


-2

WPF ยังใช้ GPU และคุณสามารถเพิ่มเฉดสีที่กำหนดเองได้โดยใช้ HLSL


WPF ไม่มีการเข้าถึงการคำนวณ GP GPU สำหรับความรู้ของฉัน เมื่อพูดถึงกราฟิก WPF System.Windows.Media มันไม่ใช่ DirectX จริง ช้ามากเมื่อเทียบกับการเขียนโปรแกรมจุดยอดระดับล่างด้วย SharpDX หรือ SlimDX
Pasi Tuomainen

ฉันเพิ่มลิงก์ไปยังชุดบทความเกี่ยวกับเอฟเฟกต์แบบกำหนดเองที่เร่งด้วย GPU ใน WPF
Mark Cidade
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.