web-dev-qa-db-ja.com

.NET OpenCLの完全な実装

私はずっと探していましたが、ほとんど運がありませんでした。 OpenCLの十分に文書化された .NETバインディング実装はありますか? (必要に応じてCUDAに何かを取ります)。さまざまな実装、CUDA.NET、OpenCL.NET、OpenTK/Clooに遭遇しましたが、スタックオーバーフローについて頻繁に言及されていますが、それらはすべてアルファ段階にあるか、利用可能な例がまったくありません。 CUDA.NETにはいくつかのヘルプファイルがありますが、これは単なるライブラリリファレンスであり、実際に始めるのに役立ちません。

私が見つけたいと思っているのは、.NETでのGPUプログラミング用のmatureライブラリです。最終的にはF#でコードを記述できるようにする必要がありますが、.NETに準拠した言語であれば、いつでも後で変換し、含まれているサンプルを使用して実行することができます。

私はずっと検索してからおそらくロングショットですが、これが検索する正しいことを知らない場合の1つに過ぎないことを望んでいます。

どんな助けも大歓迎です。

43
Adam Haile

さて、あなたが述べたすべてのライブラリは、openclネイティブライブラリの単純なラッパーです。それらは比較的少量の追加の抽象化をもたらし、一般的なopencl関数に非常に近いです。したがって、一般にopenclに精通している場合は、これらのライブラリにすぐに慣れることができます。

「OpenCL.NET」の実装は完了していると思います。OpenCL以外のものはありません。しかし、数回使用した後、レベルが低すぎることがわかりました。

私は自分のラッパーを作成しました。これはホスト部分を劇的に簡素化することで良い仕事になりますここに私のプロジェクトの1つのホスト部分があります(興味があれば、OpenClラッパーをgithubまたは他の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>());
            }
        }
    }
}
32
Lu4

OpenTKには別のバインディングライブラリがあります http://sourceforge.net/projects/cloo/

「生のバインディング(必要な場合に使用可能)に比べてはるかにクリーンなOpenCL APIを提供します」および「Clooは.NET/Monoアプリケーションを可能にするオープンソースで使いやすい管理ライブラリです」と位置付けています。 OpenCLフレームワークを最大限に活用してください。」

サンプルは非常に有望に見えます。

13
olegz

オープンソースOpenCLバインディングのセットもあります。ネット。これは、主に.NETに対応しつつOpenCL APIを忠実に反映するように自分で作成しました。このライブラリにはOOP抽象化は一切行われず、非常に高性能です。

http://openclnet.codeplex.com

お役に立てれば。

8
Ani

長年にわたっていくつかの異なるC#OpenCLラッパーを使用してきましたが、現在はNOpenCLを使用しています。それはよく書かれており、MIT License。

https://github.com/tunnelvisionlabs/NOpenCL

2
Sunsetquest

OpenCLTemplateを使用しています。

ここで素晴らしいチュートリアルを見つけることができます: http://www.cmsoft.com.br/index.php?option=com_content&view=category&layout=blog&id=41&Itemid=75

私にとってはうまくいきました。 Clooもチェックアウトすることをお勧めします。

1
Attila

Olegzの回答に同意します。 OpenCLを使い始めたばかりですが、Clooは非常に良い選択のようです。使用するのは非常に簡単で、多くのソースから、機能も非常に豊富であると聞きます。

Clooの例を含む次のサイトもご覧ください。 http://www.cmsoft.com.br/

1
user417181

f#の場合、これを見つけました: https://github.com/GabrieleCocco/FSCL.Compiler (FSharp to OpenCL Compiler)

0
iBoy