C # [बंद] के साथ GPU का उपयोग


135

मैं अपने ग्रिड से अधिक प्रोसेसिंग पावर प्राप्त करने की कोशिश कर रहा हूं।

मैं सभी cpus / cores का उपयोग कर रहा हूं, क्या GPU को C # के साथ उपयोग करना संभव है।

किसी को भी किसी भी पुस्तकालय पता है या कोई नमूना कोड मिला है?

जवाबों:


156

[ संपादित करें OCT 2017 क्योंकि यह उत्तर काफी पुराना है ]

इनमें से अधिकांश उत्तर काफी पुराने हैं, इसलिए मैंने सोचा कि मैं एक अद्यतन सारांश दूंगा जहां मुझे लगता है कि प्रत्येक परियोजना है:

  • GPU.Net (TidePowerd) - मैंने 6 महीने पहले ऐसा करने की कोशिश की थी, और यह काम कर रहा था हालांकि इसमें थोड़ा सा काम था। संकलित समय में सी # कर्नेल कोड को कोडा में कनवर्ट करता है। दुर्भाग्य से उनकी वेबसाइट डाउन हो गई है और उनके गितुब को कुछ वर्षों से अपडेट नहीं किया गया है, जो यह संकेत दे सकता है कि परियोजना मृत है ...।

  • Cudafy - खुला स्रोत और उपयोग करने के लिए बहुत आसान है। रनटाइम पर cuda के लिए C # कर्नेल कोड को परिवर्तित करता है (क्रमबद्ध और कैश करने की क्षमता के साथ)। सीपीयू (अधिकतर डीबगिंग के लिए) पर समान कर्नेल कोड आसानी से चला सकते हैं। कई GPU का समर्थन करता है। यहां दूसरों की तुलना में अधिक उदाहरण उपलब्ध हैं। अन्य उत्तरों द्वारा निर्दिष्ट बॉयलरप्लेट कोड न्यूनतम है, और मेरे मामले में कम से कम मेरी समझ से मदद मिली कि कोड कैसे काम करता है। हालांकि कोडा / एनवीडिया। दुर्भाग्य से, ऐसा लगता है कि उन्होंने कुछ वर्षों के लिए अपने समाधानों को अपडेट नहीं किया (2015 में नवीनतम प्रतिबद्ध - कोडा 7.0 का समर्थन)।

  • हाइब्रिडाइज़र । वाणिज्यिक समाधान CUDA को C # संकलित कर रहा है। विज़ुथ स्टूडियो मार्केटप्लेस पर मुफ्त सामुदायिक संस्करण और जीथब पर नमूने प्रदान करता है ।

  • उपभोक्ता GPUS के लिए एक निःशुल्क सामुदायिक संस्करण के साथ AleaGPU वाणिज्यिक समाधान। विवरण के लिए डैनियल की टिप्पणियां देखें।

  • ब्रह्मा - OpenCL के माध्यम से LINQ अभिव्यक्तियाँ चलाता है (इसलिए AMD का समर्थन करता है)। बहुत अधिक दस्तावेज / उदाहरण नहीं। आखिरी अपडेट 2011 में।

  • सी $ - अंतिम विकास 10 साल पहले खत्म हो गया था ...

  • Microsoft त्वरक - समान रूप से ऐसा नहीं लगता है कि इसे सक्रिय रूप से किसी भी लंबे समय तक विकसित किया जा रहा है।

  • कुछ अन्य ( C ++ AMP , OpenTK - dead / Cloo ) - इनमें से कई सिर्फ बाइंडिंग हैं - यानी आप C # से GPU कॉल करने में सक्षम हैं, लेकिन आपका कर्नेल कोड (कोड जो वास्तव में GPU पर चलाया जाता है) को लिखना होगा। C या OpenCL, जिसका अर्थ है कि आपको दूसरी भाषा का उपयोग (और सीखना) करना चाहिए।

जैसा कि मैंने कहा, मैं अन्य सभी पर कुडाफी की सिफारिश करूंगा - अगर यह ओपनसीएल के साथ-साथ कूडा पर भी चल सकता है तो यह सही होगा।

EDIT SEP 2013 Cudafy अब आपको CUDA और OpenCL दोनों के लिए संकलन करने की अनुमति देता है , इसलिए सभी GPU पर समान C # कोड चलाएगा। यह शानदार लगता है, हालांकि मैंने अभी तक OpenCL संकलन का परीक्षण नहीं किया है।


31
एक तेजी से विकसित विषय के एक उपयोगी प्रश्न को अपडेट करने के लिए +1।
दार्शनिक

2
Alea GPU quantalea.com सभी .NET भाषाओं के लिए CUDA समर्थन प्रदान करता है, पूरी तरह से क्रॉस प्लेटफॉर्म है और .NET GPU कोड के डीबगिंग और प्रोफाइलिंग के साथ सर्वश्रेष्ठ डेवलपर अनुभव देता है।
डैनियल

Cudafy में OpenCL का समर्थन बहुत बुरा है - जब मेरा प्रोजेक्ट बड़ा हुआ तो मैं कभी कंपाइल भी नहीं कर पाया। इसलिए मैं सादे ओपनसीएल के साथ चिपके रहूंगा और C # को बाइंडिंग बनाऊंगा।
Libor

OpenCL Cudafy का उपयोग करते हुए मेरे लिए ठीक काम करता है, वर्षों से इसका उपयोग कर रहा है
mcmillab

भविष्य के आगंतुकों की मदद करने के लिए परियोजनाओं के लिंक जोड़े।
डेन एटकिंसन

46

Microsoft अनुसंधान त्वरक एक .NET GP GPU पुस्तकालय था।


यह गरीब लाइसेंस नीति के साथ एक महान परियोजना थी। दुर्भाग्य से, अब एमएस साइट पर उपलब्ध नहीं ...
ForNeVeR

25

मुझे ब्रह्मा मिला ... इसमें एक GPGPU प्रदाता भी है जो GPU पर तरीकों को चलाने की अनुमति देता है ... प्रश्न के लिए धन्यवाद ... आज कुछ सीखा। :)


10

क्या मैं अन्वेषण के लिए संभावित एवेन्यू के रूप में एक्सएनए गेम स्टूडियो की सिफारिश कर सकता हूं? यह स्पष्ट रूप से गेम लिखने के लिए तैयार है, लेकिन आपको अपने ग्राफिक्स कार्ड तक पहुंच प्राप्त करने की क्षमता प्रदान करता है और क्षमता विकास कार्यों के लिए बेहतर पहुंच और shader विकास पहले से ही उपलब्ध था, कहते हैं, प्रबंधित DirectX। WinForms और XNA को हाइब्रिड अनुप्रयोगों में संयोजित करने के तरीके भी हैं:

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

आपको shader प्रोग्रामिंग सीखने में कुछ प्रयास करना होगा (XNA HLSL का समर्थन करता है), लेकिन यह विक्रेता-विशिष्ट समाधान जैसे nVidia के CUDA को सीखने की तुलना में एक सरल तरीका हो सकता है। लाभ यह है कि आप 100% प्रबंधित वातावरण में कार्यक्रम कर सकते हैं। यहाँ कुछ HLSL लिंक दिए गए हैं:

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

GPGPU साइट सामान्य प्रयोजन GPU प्रोग्रामिंग के लिए एक अनुशंसित गंतव्य है:

http://gpgpu.org/

शुभकामनाएँ!


1
भविष्य की शुभकामनाएं। हालांकि यकीनन उस समय एक अच्छा जवाब था (मैंने XNA के साथ थोड़ा
दबोचा था

@ मिक्की ग्रेट स्कॉट! जब मैंने अपने डैलोरियन में कूच किया और 2018 की यात्रा की, तो मैं इस उत्तर को अपडेट करना पूरी तरह से भूल गया! यदि आप अभी भी XNA में रुचि रखते हैं, तो आध्यात्मिक उत्तराधिकारी संभवत: क्रॉस-प्लेटफॉर्म MonoGame: monogame.net
डेव आर।

जबरदस्त हंसी। धन्यवाद मैं उस की जाँच करूँगा
मिक्य

9

कैसे http://www.tidepowerd.com/ GPU.NET के बारे में ?


2
मुझे इस विचार से प्यार है, लेकिन उन्होंने लगभग दो साल पहले तकनीकी सहायता के सवालों का जवाब देना बंद कर दिया था, और साइट लगभग एक साल के लिए कम-से-कम हो गई है, इसलिए मुझे लगता है कि यह परियोजना मृत है। जाहिरा तौर पर लेखक एसओ पर है , हालांकि।
ब्लूराजा - डैनी पफ्लुघोफ्ट

Teredpowerd ने GPU.NET के विकास को रोक दिया और उनके व्यवसाय को बंद कर दिया।
डेनियल

9

यहाँ एक और एक है: CUDAfy । यह GPU.Net की तरह लगता है, इसमें एक विधि-विशेषता जितनी सरल होती है, संपूर्ण विधि GPU पर चलने का कारण बन सकती है। लेकिन GPU.Net के विपरीत, CUDAfy स्वतंत्र और मुक्त-स्रोत है।

GPU.Net को बॉयलरप्लेट कोड की आवश्यकता नहीं है, हालांकि (उनके डॉक्स के अनुसार, यह "बिल्ड-टूल द्वारा स्वचालित रूप से इंजेक्ट किया जाता है") है , जबकि CUDAfy करता है।


यहां CUDAfy के साथ एक एप्लिकेशन बनाने का एक उदाहरण है।


8

खैर यह एक बहुत पुराना सवाल है, और जब से यह पूछा गया है कि चीजें बहुत बदल गई हैं।
GPU कोड लिखने के लिए .Net का उपयोग करने के लिए एक और विकल्प, जिसे किसी ने भी Alea GPU के उत्तर में नहीं बताया है । इसमें C #, F # और VB शामिल हैं।

.NET और मोनो के लिए व्यावसायिक GPU सॉफ्टवेयर विकास वातावरण। सचमुच क्रॉस-प्लेटफ़ॉर्म

F # आधिकारिक साइट में, Alea GPGPU प्रोग्रामिंग में F # का उपयोग करने के लिए पहला विकल्प है।
इस ढांचे मैं के अपने व्यापक सूची पर एक नज़र डालें सुझाव है पता करने के लिए प्राप्त करने के लिए उदाहरण


1
बस आपका जवाब देखा, मेरी पोस्ट को हटा देगा। सेठ जुआरेज द्वारा चैनल 9 साक्षात्कार भी यहां और एसओ टैग यहां देखें )
डेविड क्यूकिया

@DavidCuccia अपने पुराने उत्तरों की जाँच करने पर महान काम। और यह भी के लिए चैनल 9 लिंक धन्यवाद (2016 के दिसंबर!)
Rsh

मुझे लगता है कि आप इस चैनल 9 रिकॉर्डिंग का
डैनियल

@ डैनियल मेरा मतलब था "चैनल 9 रिकॉर्डिंग के लिए लिंक"। क्या वह अस्पष्ट था? वैसे भी, बाहर इशारा करने के लिए धन्यवाद।
Rsh

@DavidCuccia भ्रम के लिए खेद है, लिंक देखना मुश्किल था
डैनियल

7

ब्रह्मा के अलावा, सी $ (उच्चारण "सी बक्स") पर एक नज़र डालें । उनके कोडप्लेक्स साइट से :

[सी $] का उद्देश्य आधुनिक जीपीयू और सीपीयू पर सहज समानांतर प्रोग्रामिंग के लिए एक एकीकृत भाषा और प्रणाली बना रहा है।

यह C # पर आधारित है, आलसी का मूल्यांकन किया गया है, और कई त्वरक मॉडल को लक्षित करता है:

वर्तमान में इच्छित आर्किटेक्चर की सूची में जीपीयू, मल्टी-कोर सीपीयू, मल्टी-जीपीयू (एसएलआई, क्रॉसफायर) और मल्टी-जीपीयू + मल्टी-सीपीयू हाइब्रिड आर्किटेक्चर शामिल हैं।


7

शहर में एक नया Microsoft समाधान है - C ++ AMP ( यहाँ परिचय )।

C # से उपयोग P / Invoke के माध्यम से होगा, जैसा कि यहां डेस्कटॉप ऐप्स के लिए डेमो किया गया है , और यहां (न-कॉल-इट) मेट्रो ऐप्स के लिए।

संपादित करें: मुझे ध्यान देना चाहिए कि सी ++ एएमपी में एक खुला विनिर्देश है , जिसका अर्थ है कि यह केवल एमएस कंपाइलर के लिए, या केवल विंडोज के लिए आवश्यक नहीं है।

संपादित करें: जाहिरा तौर पर, प्रौद्योगिकी अब "रखरखाव मोड" में है, जिसका अर्थ है कि वे बग को ठीक कर रहे हैं, लेकिन सक्रिय रूप से विकसित नहीं हो रहे हैं।


2

प्रबंधित DirectX किसी भी तरह, काम कर सकते हैं


2
भविष्य की शुभकामनाएं। हालांकि उस समय निश्चित रूप से एक अच्छा जवाब, दुख की बात है कि MDX अब XNA के साथ बदल दिया गया है जो कि अशुद्ध भी है।
मिकी

2

यदि आपके GPU सभी समान ब्रांड हैं, तो आप Nvidia के CUDA या ATI के स्ट्रीम के माध्यम से या तो विक्रेता से GPGPU समर्थन प्राप्त करने में सक्षम हो सकते हैं। AFAIK, वे DLL प्रदान करते हैं, जिन्हें आप P / Invoke के माध्यम से उपयोग कर सकते हैं।


1

सेंटरस्पेस सॉफ़्टवेयर में उनके NMath पुस्तकालयों में आप # C प्रोजेक्ट में जोड़ सकते हैं GPU- संचालित संगणना है । यह एक वाणिज्यिक उत्पाद है।


0

यदि आप अपने स्वयं के अल्गोर्टिम्स को लागू करने जा रहे हैं, जिसे कस्टम कर्नेल की आवश्यकता है:

मैंने हाल ही में इस github रिपॉजिटरी में मेरा एक ओपन-सोर्स प्रोजेक्ट अपलोड किया है जो OpenCL का उपयोग करता है।

यह क्या करता है (आप इसके विकी पेज से भी जांच कर सकते हैं) है, कई OpenCL- सक्षम उपकरणों और उपयोगकर्ता से एक कर्नेल स्ट्रिंग का चयन करना और फिर C # या C ++ सरणी रैपर बनाना, सभी का उपयोग करके गणना करना, एक ऑटो-लोड-बैलेंसर की मदद से और पीसी से अच्छी दक्षता प्राप्त करने के लिए पाइप लाइनर (विलंब को छिपाने के लिए)।

यहां इसके उपयोग का एक उदाहरण है (सभी उपकरणों के लिए विभाजित 1024 कार्यदिवस, प्रत्येक एक ही कोड चल रहा है लेकिन विभिन्न डेटा और थ्रेड का उपयोग करें):

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

जब सभी का उपयोग नहीं किया जाता है, तो वे सभी सी ++ संसाधनों को अपने विनाशकों के साथ छोड़ देते हैं।

लेकिन यह वह परिपक्व नहीं है, इसलिए गितुब मुद्दों के टैब पर किसी भी "मुद्दे" को जोड़ने के लिए स्वतंत्र महसूस करें। मल्टी-पीसी-क्लस्टर प्रासंगिक वर्ग काम नहीं कर रहे हैं और अभी तक अंग्रेजी में अनुवादित नहीं हैं, लेकिन यह कम से कम एकल पीसी में सभी उपकरणों का उपयोग कर सकते हैं।


-2

WPF भी GPU का उपयोग करता है और आप HLSL का उपयोग करके कस्टम शेड जोड़ सकते हैं।


WPF के पास मेरी जानकारी के लिए GP GPU कम्प्यूटेशन एक्सेस नहीं है। जब WPF System.Windows.Media ग्राफिक्स के बारे में बात की जाती है, तो यह वास्तविक DirectX नहीं है। SharpDX या SlimDX के साथ निचले स्तर के वर्टेक्स प्रोग्रामिंग की तुलना में बहुत धीमी है।
पासी तुओमीनेन

मैंने WPF में GPU- त्वरित कस्टम प्रभावों पर लेखों की एक श्रृंखला के लिए एक लिंक जोड़ा।
मार्क सिडैड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.