[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
cl_kernel clCreateKernel( cl_program program, const char *kernel_name, cl_int *errcode_ret )programはカーネルを持つプログラムです。
cl_int clReleaseKernel(cl_kernel kernel)kernelは破棄するカーネルです。
cl_int clSetKernelArg( cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value )
cl_int clEnqueueTask( cl_command_queue command_queue, cl_kernel kernel, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event )
using System;class MyProgram{static void Main(){IntPtr device = getDevices(getPlatforms()[0], DeviceType.Default)[0];Context context = new Context(device);CommandQueue commandQueue = new CommandQueue(context, device);Program program = new Program(context, System.IO.File.ReadAllText("myKernelProgram.cl"));program.Build(device);Kernel kernel = new Kernel(program, "myKernelFunction");Buffer buffer = Buffer.FromCopiedHostMemory(context, new float[] { 1, 2, 3 });kernel.SetArgument(0, buffer);commandQueue.EnqueueTask(kernel);float[] readBack = new float[3];commandQueue.ReadBuffer(buffer, readBack);foreach (var number in readBack){Console.WriteLine(number);}}private static IntPtr[] getDevices(IntPtr platform, DeviceType deviceType){int deviceCount;OpenCLFunctions.clGetDeviceIDs(platform, deviceType, 0, null, out deviceCount);IntPtr[] result = new IntPtr[deviceCount];OpenCLFunctions.clGetDeviceIDs(platform, deviceType, deviceCount, result, out deviceCount);return result;}private static IntPtr[] getPlatforms(){int platformCount;OpenCLFunctions.clGetPlatformIDs(0, null, out platformCount);IntPtr[] result = new IntPtr[platformCount];OpenCLFunctions.clGetPlatformIDs(platformCount, result, out platformCount);return result;}}
using System;using System.Runtime.InteropServices;using System.Linq;class Context{public IntPtr InternalPointer { get; private set; }public Context(params IntPtr[] devices){int error;InternalPointer = OpenCLFunctions.clCreateContext(null,devices.Length,devices,null,IntPtr.Zero,out error);}~Context(){OpenCLFunctions.clReleaseContext(InternalPointer);}}class CommandQueue{public IntPtr InternalPointer { get; private set; }public CommandQueue(Context context, IntPtr device){int error;InternalPointer = OpenCLFunctions.clCreateCommandQueue(context.InternalPointer,device,0,out error);}~CommandQueue(){OpenCLFunctions.clReleaseCommandQueue(InternalPointer);}public void ReadBuffer<T>(Buffer buffer, T[] systemBuffer) where T : struct{GCHandle handle = GCHandle.Alloc(systemBuffer, GCHandleType.Pinned);OpenCLFunctions.clEnqueueReadBuffer(InternalPointer,buffer.InternalPointer,true,0,Math.Min(buffer.SizeInBytes, Marshal.SizeOf(typeof(T)) * systemBuffer.Length),handle.AddrOfPinnedObject(),0,IntPtr.Zero,IntPtr.Zero);handle.Free();}public void EnqueueTask(Kernel kernel){OpenCLFunctions.clEnqueueTask(InternalPointer,kernel.InternalPointer,0,null,IntPtr.Zero);}}class Buffer{public IntPtr InternalPointer { get; private set; }public int SizeInBytes { get; private set; }private Buffer() { }~Buffer(){OpenCLFunctions.clReleaseMemObject(InternalPointer);}public static Buffer FromCopiedHostMemory<T>(Context context, T[] initialData) where T : struct{Buffer result = new Buffer();result.SizeInBytes = Marshal.SizeOf(typeof(T)) * initialData.Length;int errorCode;GCHandle handle = GCHandle.Alloc(initialData, GCHandleType.Pinned);result.InternalPointer = OpenCLFunctions.clCreateBuffer(context.InternalPointer,MemoryFlags.CopyHostMemory,result.SizeInBytes,handle.AddrOfPinnedObject(),out errorCode);handle.Free();return result;}}class Program{public IntPtr InternalPointer { get; private set; }public Program(Context context, params string[] sources){int errorCode;InternalPointer = OpenCLFunctions.clCreateProgramWithSource(context.InternalPointer,sources.Length,sources,null,out errorCode);}~Program(){OpenCLFunctions.clReleaseProgram(InternalPointer);}public void Build(params IntPtr[] devices){OpenCLFunctions.clBuildProgram(InternalPointer,devices.Length,devices,null,null,IntPtr.Zero);}}class Kernel{public IntPtr InternalPointer { get; private set; }public Kernel(Program program, string functionName){int errorCode;InternalPointer = OpenCLFunctions.clCreateKernel(program.InternalPointer,functionName,out errorCode);}~Kernel(){OpenCLFunctions.clReleaseKernel(InternalPointer);}public void SetArgument(int argumentIndex, Buffer buffer){IntPtr bufferPointer = buffer.InternalPointer;OpenCLFunctions.clSetKernelArg(InternalPointer,argumentIndex,Marshal.SizeOf(typeof(IntPtr)),ref bufferPointer);}}
using System;using System.Runtime.InteropServices;static class OpenCLFunctions{[DllImport("OpenCL.dll")]public static extern int clGetPlatformIDs(int entryCount, IntPtr[] platforms, out int platformCount);[DllImport("OpenCL.dll")]public static extern int clGetDeviceIDs(IntPtr platform,DeviceType deviceType,int entryCount,IntPtr[] devices,out int deviceCount);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateContext(IntPtr[] properties,int deviceCount,IntPtr[] devices,NotifyContextCreated pfnNotify,IntPtr userData,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseContext(IntPtr context);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateCommandQueue(IntPtr context,IntPtr device,long properties,out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseCommandQueue(IntPtr commandQueue);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateBuffer(IntPtr context,MemoryFlags allocationAndUsage,int sizeInBytes,IntPtr hostPtr,//out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseMemObject(IntPtr memoryObject);[DllImport("OpenCL.dll")]public static extern int clEnqueueReadBuffer(IntPtr commandQueue,IntPtr buffer,bool isBlocking,int offset,int sizeInBytes,IntPtr result,int numberOfEventsInWaitList,IntPtr eventWaitList,IntPtr eventObjectOut);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateProgramWithSource(IntPtr context,int count,string[] programSources,int[] sourceLengths,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clBuildProgram(IntPtr program,int deviceCount,IntPtr[] deviceList,string buildOptions,NotifyProgramBuilt notify,IntPtr userData);[DllImport("OpenCL.dll")]public static extern int clReleaseProgram(IntPtr program);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateKernel(IntPtr kernel, string functionName, out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseKernel(IntPtr kernel);[DllImport("OpenCL.dll")]public static extern int clSetKernelArg(IntPtr kernel, int argumentIndex, int size, ref IntPtr value);[DllImport("OpenCL.dll")]public static extern int clEnqueueTask(IntPtr commandQueue,IntPtr kernel,int countOfEventsInWaitList,IntPtr[] eventWaitList,IntPtr eventObject);}delegate void NotifyContextCreated(string errorInfo, IntPtr privateInfoSize, int cb, IntPtr userData);delegate void NotifyProgramBuilt(IntPtr program, IntPtr userData);enum DeviceType : long{Default = (1 << 0),Cpu = (1 << 1),Gpu = (1 << 2),Accelerator = (1 << 3),All = 0xFFFFFFFF}enum MemoryFlags : long{ReadWrite = (1 << 0),WriteOnly = (1 << 1),ReadOnly = (1 << 2),UseHostMemory = (1 << 3),HostAccessible = (1 << 4),CopyHostMemory = (1 << 5)}
__kernel void myKernelFunction(__global float* numbers){numbers[0] = 3;numbers[1] = 4;numbers[2] = 5;}
このプログラムは実はあまりGPUの並列処理っぽくはない、シングルスレッドなプログラムです。__kernel void myKernelFunction(__global float* numbers){numbers[0] = 3;numbers[1] = 4;numbers[2] = 5;}
cl_program clCreateProgramWithSource( cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret )
cl_int clReleaseProgram(cl_program program)
cl_int clBuildProgram( cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), void *user_data )
using System;class MyProgram{static void Main(){IntPtr device = getDevices(getPlatforms()[0], DeviceType.Default)[0];Context context = new Context(device);CommandQueue commandQueue = new CommandQueue(context, device);Program program = new Program(context, System.IO.File.ReadAllText("myKernelProgram.cl"));program.Build(device);Buffer buffer = Buffer.FromCopiedHostMemory(context, new float[] { 1, 2, 3 });float[] readBack = new float[3];commandQueue.ReadBuffer(buffer, readBack);foreach (var number in readBack){Console.WriteLine(number);}}private static IntPtr[] getDevices(IntPtr platform, DeviceType deviceType){int deviceCount;OpenCLFunctions.clGetDeviceIDs(platform, deviceType, 0, null, out deviceCount);IntPtr[] result = new IntPtr[deviceCount];OpenCLFunctions.clGetDeviceIDs(platform, deviceType, deviceCount, result, out deviceCount);return result;}private static IntPtr[] getPlatforms(){int platformCount;OpenCLFunctions.clGetPlatformIDs(0, null, out platformCount);IntPtr[] result = new IntPtr[platformCount];OpenCLFunctions.clGetPlatformIDs(platformCount, result, out platformCount);return result;}}
using System;using System.Runtime.InteropServices;class Context{public IntPtr InternalPointer { get; private set; }public Context(params IntPtr[] devices){int error;InternalPointer = OpenCLFunctions.clCreateContext(null,devices.Length,devices,null,IntPtr.Zero,out error);}~Context(){OpenCLFunctions.clReleaseContext(InternalPointer);}}class CommandQueue{public IntPtr InternalPointer { get; private set; }public CommandQueue(Context context, IntPtr device){int error;InternalPointer = OpenCLFunctions.clCreateCommandQueue(context.InternalPointer,device,0,out error);}~CommandQueue(){OpenCLFunctions.clReleaseCommandQueue(InternalPointer);}public void ReadBuffer<T>(Buffer buffer, T[] systemBuffer) where T : struct{GCHandle handle = GCHandle.Alloc(systemBuffer, GCHandleType.Pinned);OpenCLFunctions.clEnqueueReadBuffer(InternalPointer,buffer.InternalPointer,true,0,Math.Min(buffer.SizeInBytes, Marshal.SizeOf(typeof(T)) * systemBuffer.Length),handle.AddrOfPinnedObject(),0,IntPtr.Zero,IntPtr.Zero);handle.Free();}}class Buffer{public IntPtr InternalPointer { get; private set; }public int SizeInBytes { get; private set; }private Buffer() { }~Buffer(){OpenCLFunctions.clReleaseMemObject(InternalPointer);}public static Buffer FromCopiedHostMemory<T>(Context context, T[] initialData) where T : struct{Buffer result = new Buffer();result.SizeInBytes = Marshal.SizeOf(typeof(T)) * initialData.Length;int errorCode;GCHandle handle = GCHandle.Alloc(initialData, GCHandleType.Pinned);result.InternalPointer = OpenCLFunctions.clCreateBuffer(context.InternalPointer,MemoryFlags.CopyHostMemory,result.SizeInBytes,handle.AddrOfPinnedObject(),out errorCode);handle.Free();return result;}}class Program{public IntPtr InternalPointer { get; private set; }public Program(Context context, params string[] sources){int errorCode;InternalPointer = OpenCLFunctions.clCreateProgramWithSource(context.InternalPointer,sources.Length,sources,null,out errorCode);}~Program(){OpenCLFunctions.clReleaseProgram(InternalPointer);}public void Build(params IntPtr[] devices){OpenCLFunctions.clBuildProgram(InternalPointer,devices.Length,devices,null,null,IntPtr.Zero);}}
using System;using System.Runtime.InteropServices;static class OpenCLFunctions{[DllImport("OpenCL.dll")]public static extern int clGetPlatformIDs(int entryCount, IntPtr[] platforms, out int platformCount);[DllImport("OpenCL.dll")]public static extern int clGetDeviceIDs(IntPtr platform,DeviceType deviceType,int entryCount,IntPtr[] devices,out int deviceCount);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateContext(IntPtr[] properties,int deviceCount,IntPtr[] devices,NotifyContextCreated pfnNotify,IntPtr userData,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseContext(IntPtr context);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateCommandQueue(IntPtr context,IntPtr device,long properties,out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseCommandQueue(IntPtr commandQueue);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateBuffer(IntPtr context,MemoryFlags allocationAndUsage,int sizeInBytes,IntPtr hostPtr,//out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseMemObject(IntPtr memoryObject);[DllImport("OpenCL.dll")]public static extern int clEnqueueReadBuffer(IntPtr commandQueue,IntPtr buffer,bool isBlocking,int offset,int sizeInBytes,IntPtr result,int numberOfEventsInWaitList,IntPtr eventWaitList,IntPtr eventObjectOut);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateProgramWithSource(IntPtr context,int count,string[] programSources,int[] sourceLengths,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clBuildProgram(IntPtr program,int deviceCount,IntPtr[] deviceList,string buildOptions,NotifyProgramBuilt notify,IntPtr userData);[DllImport("OpenCL.dll")]public static extern int clReleaseProgram(IntPtr program);}delegate void NotifyContextCreated(string errorInfo, IntPtr privateInfoSize, int cb, IntPtr userData);delegate void NotifyProgramBuilt(IntPtr program, IntPtr userData);enum DeviceType : long{Default = (1 << 0),Cpu = (1 << 1),Gpu = (1 << 2),Accelerator = (1 << 3),All = 0xFFFFFFFF}enum MemoryFlags : long{ReadWrite = (1 << 0),WriteOnly = (1 << 1),ReadOnly = (1 << 2),UseHostMemory = (1 << 3),HostAccessible = (1 << 4),CopyHostMemory = (1 << 5)}
__kernel void myKernelFunction(__global float* numbers){numbers[0] = 3;numbers[1] = 4;numbers[2] = 5;}
cl_mem clCreateBuffer( cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret )
cl_mem_flags | 値 | 解説 |
CL_MEM_READ_WRITE | 1 << 0 | メモリがGPUによって読み込まれもするし書きこまれもすることを表します。これがデフォルトです。 |
CL_MEM_WRITE_ONLY | 1 << 1 | メモリがGPUによって書きこまれはするけれど読み込まれることはないということを表します。これを指定してデータを読み込もうとしたらどうなるかは未定義です。 |
CL_MEM_READ_ONLY | 1 << 2 | メモリが読み込み専用であることを表します。これを指定してデータを書きこもうとしたらどうなるかは未定義です。 |
CL_MEM_USE_HOST_PTR | 1 << 3 | このフラグはhost_ptrがNULL出ないときに限り有効です。もしこの値が指定されたら、アプリケーションはOpenCLの実装に対してhost_ptrで指定されたメモリをこのメモリオブジェクト(バッファ)のストレージとして使用して欲しいということを意味します。 |
CL_MEM_ALLOC_HOST_PTR | 1 << 4 | CPUからアクセス可能なメモリとしてメモリを生成してほしいことを表します。 この値とCL_MEM_USE_HOST_PTRは同時に指定できません。 |
CL_MEM_COPY_HOST_PTR | 1 << 5 | このフラグはhost_ptrがNULL出ないときに限って有効です。この値が指定されたら、host_ptrに書かれたデータをコピーしてメモリがGPUに確保されます。 この値とCL_MEM_USE_HOST_PTRは同時に指定できません。 この値はCL_MEM_ALLOC_HOST_PTRと一緒に使うことができます。 |
cl_int clReleaseMemObject(cl_mem memobj)
cl_int clEnqueueReadBuffer( cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event )
using System;class Program{static void Main(){IntPtr device = getDevices(getPlatforms()[0], DeviceType.Default)[0];Context context = new Context(device);CommandQueue commandQueue = new CommandQueue(context, device);Buffer buffer = Buffer.FromCopiedHostMemory(context, new float[] { 1, 2, 3 });float[] readBack = new float[3];commandQueue.ReadBuffer(buffer, readBack);foreach (var number in readBack){Console.WriteLine(number);}}private static IntPtr[] getDevices(IntPtr platform, DeviceType deviceType){int deviceCount;OpenCLFunctions.clGetDeviceIDs(platform, deviceType, 0, null, out deviceCount);IntPtr[] result = new IntPtr[deviceCount];OpenCLFunctions.clGetDeviceIDs(platform, deviceType, deviceCount, result, out deviceCount);return result;}private static IntPtr[] getPlatforms(){int platformCount;OpenCLFunctions.clGetPlatformIDs(0, null, out platformCount);IntPtr[] result = new IntPtr[platformCount];OpenCLFunctions.clGetPlatformIDs(platformCount, result, out platformCount);return result;}}
using System;using System.Runtime.InteropServices;class Context{public IntPtr InternalPointer { get; private set; }public Context(params IntPtr[] devices){int error;InternalPointer = OpenCLFunctions.clCreateContext(null,devices.Length,devices,null,IntPtr.Zero,out error);}~Context(){OpenCLFunctions.clReleaseContext(InternalPointer);}}class CommandQueue{public IntPtr InternalPointer { get; private set; }public CommandQueue(Context context, IntPtr device){int error;InternalPointer = OpenCLFunctions.clCreateCommandQueue(context.InternalPointer,device,0,out error);}~CommandQueue(){OpenCLFunctions.clReleaseCommandQueue(InternalPointer);}public void ReadBuffer<T>(Buffer buffer, T[] systemBuffer) where T : struct{GCHandle handle = GCHandle.Alloc(systemBuffer, GCHandleType.Pinned);OpenCLFunctions.clEnqueueReadBuffer(InternalPointer,buffer.InternalPointer,true,0,Math.Min(buffer.SizeInBytes, Marshal.SizeOf(typeof(T)) * systemBuffer.Length),handle.AddrOfPinnedObject(),0,IntPtr.Zero,IntPtr.Zero);handle.Free();}}class Buffer{public IntPtr InternalPointer { get; private set; }public int SizeInBytes { get; private set; }private Buffer() { }~Buffer(){OpenCLFunctions.clReleaseMemObject(InternalPointer);}public static Buffer FromCopiedHostMemory<T>(Context context, T[] initialData) where T : struct{Buffer result = new Buffer();result.SizeInBytes = Marshal.SizeOf(typeof(T)) * initialData.Length;int errorCode;GCHandle handle = GCHandle.Alloc(initialData, GCHandleType.Pinned);result.InternalPointer = OpenCLFunctions.clCreateBuffer(context.InternalPointer,MemoryFlags.CopyHostMemory,result.SizeInBytes,handle.AddrOfPinnedObject(),out errorCode);handle.Free();return result;}}
using System;using System.Runtime.InteropServices;static class OpenCLFunctions{[DllImport("OpenCL.dll")]public static extern int clGetPlatformIDs(int entryCount, IntPtr[] platforms, out int platformCount);[DllImport("OpenCL.dll")]public static extern int clGetDeviceIDs(IntPtr platform,DeviceType deviceType,int entryCount,IntPtr[] devices,out int deviceCount);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateContext(IntPtr[] properties,int deviceCount,IntPtr[] devices,NotifyCallback pfnNotify,IntPtr userData,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseContext(IntPtr context);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateCommandQueue(IntPtr context,IntPtr device,long properties,out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseCommandQueue(IntPtr commandQueue);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateBuffer(IntPtr context,MemoryFlags allocationAndUsage,int sizeInBytes,IntPtr hostPtr,out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseMemObject(IntPtr memoryObject);[DllImport("OpenCL.dll")]public static extern int clEnqueueReadBuffer(IntPtr commandQueue,IntPtr buffer,bool isBlocking,int offset,int sizeInBytes,IntPtr result,int numberOfEventsInWaitList,IntPtr eventWaitList,IntPtr eventObjectOut);}delegate void NotifyCallback(string errorInfo, IntPtr privateInfoSize, int cb, IntPtr userData);enum DeviceType : long{Default = (1 << 0),Cpu = (1 << 1),Gpu = (1 << 2),Accelerator = (1 << 3),All = 0xFFFFFFFF}enum MemoryFlags : long{ReadWrite = (1 << 0),WriteOnly = (1 << 1),ReadOnly = (1 << 2),UseHostMemory = (1 << 3),HostAccessible = (1 << 4),CopyHostMemory = (1 << 5)}
cl_command_queue clCreateCommandQueue( cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret )
コマンドキュープロパティ | 解説 |
CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | コマンドキュー中のコマンド実行をout-of-order(並列実行)にします。そうでない場合はin-orderで、これはコマンド実行の順番を入れ替え無いモードです。 |
CL_QUEUE_PROFILING_ENABLE | コマンドキュー内のcommandのプロファイリングを有効にします。詳細はclGetEventProfilingInfo関数を見てください。 |
名前 | 値 | 解説 |
CL_SUCCESS | 0 | 関数は成功しました。 |
CL_INVALID_CONTEXT | -34 | contextが無効です。 |
CL_INVALID_DEVICE | -33 | deviceが無効です。あるいはdeviceがcontextに結び付けられていません。 |
CL_INVALID_VALUE | -30 | propertiesが無効です。 |
CL_INVALID_QUEUE_PROPERTIES | -35 | propertiesは有効ですが、デバイスにサポートされていません。 |
CL_OUT_OF_RESOURCES | -5 | デバイスがリソースを確保するのに失敗しました。 |
CL_OUT_OF_HOST_MEMORY | -6 | メモリが足りません。 |
cl_int clReleaseCommandQueue( cl_command_queue command_queue )
名前 | 値 | 解説 |
CL_SUCCESS | 0 | 関数は成功しました。 |
CL_INVALID_COMMAND_QUEUE | -36 | command_queueが無効です。 |
CL_OUT_OF_RESOURCES | -5 | デバイスがリソースを確保できませんでした。 |
CL_OUT_OF_HOST_MEMORY | -6 | メモリが足りません。 |
using System;class Program{static void Main(){IntPtr device = getDevices(getPlatforms()[0], DeviceType.Default)[0];Context context = new Context(device);CommandQueue commandQueue = new CommandQueue(context, device);}private static IntPtr[] getDevices(IntPtr platform, DeviceType deviceType){int deviceCount;OpenCLFunctions.clGetDeviceIDs(platform, deviceType, 0, null, out deviceCount);IntPtr[] result = new IntPtr[deviceCount];OpenCLFunctions.clGetDeviceIDs(platform, deviceType, deviceCount, result, out deviceCount);return result;}private static IntPtr[] getPlatforms(){int platformCount;OpenCLFunctions.clGetPlatformIDs(0, null, out platformCount);IntPtr[] result = new IntPtr[platformCount];OpenCLFunctions.clGetPlatformIDs(platformCount, result, out platformCount);return result;}}
using System;class Context{public IntPtr InternalPointer { get; private set; }public Context(params IntPtr[] devices){int error;InternalPointer = OpenCLFunctions.clCreateContext(null,devices.Length,devices,null,IntPtr.Zero,out error);}~Context(){OpenCLFunctions.clReleaseContext(InternalPointer);}}class CommandQueue{public IntPtr InternalPointer { get; private set; }public CommandQueue(Context context, IntPtr device){int error;InternalPointer = OpenCLFunctions.clCreateCommandQueue(context.InternalPointer,device,0,out error);}~CommandQueue(){OpenCLFunctions.clReleaseCommandQueue(InternalPointer);}}
using System;using System.Runtime.InteropServices;static class OpenCLFunctions{[DllImport("OpenCL.dll")]public static extern int clGetPlatformIDs(int entryCount, IntPtr[] platforms, out int platformCount);[DllImport("OpenCL.dll")]public static extern int clGetDeviceIDs(IntPtr platform,DeviceType deviceType,int entryCount,IntPtr[] devices,out int deviceCount);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateContext(IntPtr[] properties,int deviceCount,IntPtr[] devices,NotifyCallback pfnNotify,IntPtr userData,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseContext(IntPtr context);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateCommandQueue(IntPtr context,IntPtr device,long properties,out int errorCodeReturn);[DllImport("OpenCL.dll")]public static extern int clReleaseCommandQueue(IntPtr commandQueue);}delegate void NotifyCallback(string errorInfo, IntPtr privateInfoSize, int cb, IntPtr userData);enum DeviceType:long{Default = (1 << 0),Cpu = (1 << 1),Gpu = (1 << 2),Accelerator = (1 << 3),All = 0xFFFFFFFF}
cl_context clCreateContext( const cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, (void CL_CALLBACK *pfn_notify)( const char *errinfo, const void *private_info, size_t cb, void *user_data ), void *user_data, cl_int *errcode_ret )
cl_context_properties | 値 | プロパティ値 | 解説 |
CL_CONTEXT_PLATFORM | 0x1084 | cl_platform_id | 使うプラットフォームです。 |
CL_CONTEXT_D3D10_DEVICE_KHR | 0x4014 | ID3D10Device* | cl_khr_d3d10_sharing拡張が有効なときに使えます。Direct3D10との相互運用が可能です。デフォルトではNULLです。 |
CL_GL_CONTEXT_KHR | 0x2008 | cl_khr_gl_sharing拡張が有効なときに使えます。 |
|
CL_EGL_DISPLAY_KHR | 0x2009 | ||
CL_GLX_DISPLAY_KHR | 0x200A | ||
CL_WGL_HDC_KHR | 0x200B | ||
CL_CGL_SHAREGROUP_KHR | 0x200C |
cl_int clReleaseContext(cl_context context);
名前 | 値 | 解説 |
CL_SUCCESS | 0 | 関数は成功しました。 |
CL_INVALID_CONTEXT | -34 | contextが無効な値です。 |
CL_OUT_OF_RESOURCES | -5 | デバイスがリソースを作れませんでした。 |
CL_OUT_OF_HOST_MEMORY | -6 | メモリが足りません。 |
using System;class Program{static void Main(){Context context = new Context(getDevices(getPlatforms()[0], DeviceType.Default));}private static IntPtr[] getDevices(IntPtr platform, DeviceType deviceType){int deviceCount;OpenCLFunctions.clGetDeviceIDs(platform, deviceType, 0, null, out deviceCount);IntPtr[] result = new IntPtr[deviceCount];OpenCLFunctions.clGetDeviceIDs(platform, deviceType, deviceCount, result, out deviceCount);return result;}private static IntPtr[] getPlatforms(){int platformCount;OpenCLFunctions.clGetPlatformIDs(0, null, out platformCount);IntPtr[] result = new IntPtr[platformCount];OpenCLFunctions.clGetPlatformIDs(platformCount, result, out platformCount);return result;}}
using System;class Context{public IntPtr InternalPointer { get; private set; }public Context(IntPtr[] devices){int error;InternalPointer = OpenCLFunctions.clCreateContext(null,devices.Length,devices,null,IntPtr.Zero,out error);}~Context(){OpenCLFunctions.clReleaseContext(InternalPointer);}}
using System;using System.Runtime.InteropServices;static class OpenCLFunctions{[DllImport("OpenCL.dll")]public static extern int clGetPlatformIDs(int entryCount, IntPtr[] platforms, out int platformCount);[DllImport("OpenCL.dll")]public static extern int clGetDeviceIDs(IntPtr platform,DeviceType deviceType,int entryCount,IntPtr[] devices,out int deviceCount);[DllImport("OpenCL.dll")]public static extern IntPtr clCreateContext(IntPtr[] properties,int deviceCount,IntPtr[] devices,NotifyCallback pfnNotify,IntPtr userData,out int errorCode);[DllImport("OpenCL.dll")]public static extern int clReleaseContext(IntPtr context);}delegate void NotifyCallback(string errorInfo, IntPtr privateInfoSize, int cb, IntPtr userData);enum DeviceType:long{Default = (1 << 0),Cpu = (1 << 1),Gpu = (1 << 2),Accelerator = (1 << 3),All = 0xFFFFFFFF}