C# multithreading + CUDA /ErrorInvalidContext/
2012-07-31T15:44:08+02:00
2012-07-31T15:44:09+02:00
2022-07-19T08:40:31+02:00
thezollie
Sziasztok!

Elsősorban azokhoz intézném a kérdésem, akik jártasak CUDA programozásban.

Problémám:
Létrehozok több CPU szálat, melyekkel el szeretném érni a CUDA-s algoritmusomat.

Írtam a szemléltetésre egy egyszerű példaprogramot:


class Worker { public GPGPU gpu { get; set; } public int TID { get; set; } public void test(object stateObject) { int[] dev0 = gpu.Allocate<int>(512); int gridSize = 1; int blockSize = 512; gpu.Launch(gridSize, blockSize, "aaa", dev0); int[] host0 = new int[512]; gpu.CopyFromDevice<int>(dev0, host0); gpu.FreeAll(); Console.WriteLine(TID + " thread done."); Console.ReadKey(); } } class Program { static void Main(string[] args) { GPGPU gpu = CudafyHost.GetDevice(); CudafyModule module = CudafyModule.TryDeserialize(); if (module == null || !module.TryVerifyChecksums()) { module = CudafyTranslator.Cudafy(); module.Serialize(); } if (!gpu.IsModuleLoaded(module.Name)) { gpu.LoadModule(module); } if (!gpu.IsMultithreadingEnabled) { gpu.EnableMultithreading(); } List<Thread> threadArray = new List<Thread>(); for (int i = 0; i < 10; i++) { Worker w = new Worker() { gpu = gpu, TID=i }; Thread t = new Thread(w.test); t.Start(); threadArray.Add(t); } } [Cudafy] public static void aaa(GThread thread, int[] a) { int tid = thread.threadIdx.x; a[tid] = 1; }

A lényege, hogy 10 CPU szálon keresztül szeretném futtatni a Cuda-s programom, mely csak annyit csinál, hogy 1-esekkel tölt fel egy 512 elemű int típusú tömböt.

ErrorInvalidContext-et kapok az allokálásnál. Több szál akar egyszerre allokálni, ebben szeretném kérni a segítségeteket, hogy tudnám szálbiztossá varázsolni a kódom.
EnableMultiThreading nem segített, a Cudafy fejlesztőjétől már kértek ilyen problémára példát, csak egy ideje nem tudjuk elérni, ezért bátorkodtam ide írni, hátha találkozott már valaki hasonló problémával.

A probléma forrása az volt, hogy Cuda-ra írt algorimusaimat egy algoritmus-láncba fűztem, ezek főleg képfeldolgozó algoritmusok:
Elsőként egy Subtraction (két azonos méretű kép között keresi meg a különbséget), majd az eredményére ráhúztam egy InverseFilter-t, majd ennek eredményére pedig ráeresztettem egy ConvolutionMatrix-ot (3x3-asat, horisontal edge detection-el).
Mivel a programom többszálú a hatékonyság érdekében, ezét sajnos ErrorInvalidContext-et kapok :/

Köszönöm a segítségeteket!
Zollie
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd