web-dev-qa-db-fra.com

Implémentations complètes .NET OpenCL

J'ai cherché partout mais j'ai eu peu de chance. Existe-t-il des implémentations de liaisons bien documentées .NET pour OpenCL? (Je prendrais quelque chose pour CUDA si je devais le faire) . J'ai eu diverses implémentations, CUDA.NET, OpenCL.NET, OpenTK/Cloo (je sais, on parle souvent de stackoverflow), mais ils semblent tous soit être au stade alpha, soit ne pas avoir d’exemples disponibles. CUDA.NET contient des fichiers d'aide, mais il ne s'agit que d'une référence à une bibliothèque, ce qui ne vous aide pas vraiment à démarrer.

Ce que j'espère, c'est une bibliothèque mature pour la programmation GPU dans .NET . Je dois éventuellement être capable d'écrire le code en F #, mais je choisirais n'importe quel langage compatible .NET. convertissez-le toujours plus tard et utilisez tous les exemples fournis pour être opérationnel.

Probablement un long coup depuis que j'ai cherché partout, mais j'espère que c'est juste un de ces cas où je ne sais pas la bonne chose à rechercher.

Toute aide serait grandement appréciée.

42
Adam Haile

Eh bien, toutes les bibliothèques que vous avez indiquées sont de simples wrappers pour les bibliothèques natives opencl. Ils posent relativement peu d’abstractions supplémentaires et sont très proches des fonctions opencl générales. Donc, si vous connaissez opencl en général, vous vous familiariserez rapidement avec ces librairies.

Je pense que l'implémentation 'OpenCL.NET' est terminée, elle est libre de tout ce qui n'est pas OpenCL. Mais après l'avoir utilisé plusieurs fois, je l'ai trouvé trop bas.

J'ai créé mon propre wrapper, cela me sert bien en simplifiant considérablement la partie Host. Voici la partie Host de l'un de mes projets (si cela vous intéresse, je peux publier mon wrapper OpenCl dans github ou tout autre service svn):

using System;
using System.Net;
using System.Collections.Generic;
using System.IO;

using Shared;
using Shared.IO;
using Shared.OpenCL;

namespace Testing
{
    public class ApplicationClass
    {
        static Random Rand = new Random();

        static Single[] RandomArray(Int32 length)
        {
            Single[] result = new Single[length];

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = (Single)Rand.NextDouble();
            }

            return result;
        }

        static void Main(string[] args)
        {
            DeviceGlobalMemory output = new Byte[4096];

            DeviceGlobalMemory indeces = RandomArray(102400);
            DeviceGlobalMemory ops = new Byte[3072];
            DeviceGlobalMemory data = RandomArray(1048576);

            Console.Write("Creating kernel...");

            Kernel kernel = Kernel.Create("Kernel", File.ReadAllText("Test.c"), data, indeces, ops, output);

            Console.Write("Executing kernel...");

            Event e = kernel.Execute(256, 256);

            kernel.CommandQueue.Finish();

            Console.WriteLine("done, operation took {0}", Profiler.DurationSeconds(e));

            UnmanagedReader reader = new UnmanagedReader(new DeviceBufferStream(output));

            for (int i = 0; i < 256; i++)
            {
                if (i % 4 == 0) Console.WriteLine();
                if (i % 16 == 0) Console.WriteLine();

                Console.Write("{0}\t", reader.Read<Single>());
            }
        }
    }
}
31
Lu4

Il existe une autre bibliothèque de liaisons de OpenTK http://sourceforge.net/projects/cloo/ .

Ils la positionnent comme "Elle fournit une API OpenCL beaucoup plus propre par rapport aux liaisons brutes (qui sont également disponibles au cas où vous en auriez besoin)" et "Cloo est une bibliothèque ouverte, facile à utiliser et gérée qui permet tirer pleinement parti du cadre OpenCL. "

Les échantillons semblent très prometteurs.

12
olegz

J'ai aussi un ensemble de liaisons OpenCL open source pour. NET. Je l'ai écrit pour moi principalement afin de refléter fidèlement l'API OpenCL tout en étant convivial .NET. Il n'y aura jamais d'abstractions OOP pour cette bibliothèque, et elle est assez performante.

http://openclnet.codeplex.com

J'espère que cela t'aides.

8
Ani

J'ai utilisé différents wrappers C # OpenCL au fil des ans et j'utilise maintenant NOpenCL. Il est bien écrit et est sous la licence MIT. 

https://github.com/tunnelvisionlabs/NOpenCL

1
Sunsetquest

J'ai utilisé OpenCLTemplate.

Vous pouvez trouver un bon tutoriel ici: http://www.cmsoft.com.br/index.php?option=com_content&view=category&layout=blog&id=41&Itemid=75

Cela a bien fonctionné pour moi. Je suggère que vous devriez vérifier Cloo aussi.

1
Attila

Je suis d’accord avec olegz, réponse… .. Je n’ai commencé à utiliser OpenCL mais Cloo semble être un très bon choix. Je le trouve assez simple à utiliser et, selon de nombreuses sources, il est également très riche en fonctionnalités.

Consultez le site suivant, qui contient également quelques exemples pour Cloo: http://www.cmsoft.com.br/

1
user417181

pour F # j'ai trouvé celui-ci: https://github.com/GabrieleCocco/FSCL.Compiler (FSharp to OpenCL Compiler)

0
iBoy