-7
LはGpuでコードを高速化するためにC#opencl.netを学びたいと思っていますが、このコードはウェブサイトhttps://habrahabr.ru/post/124873/にあります。私は意味を理解できません。誰でも説明でき、どこでもopencl.netについて学ぶことができますとても。誰がこのC#opencl.netコードを理解していますか?
private void button4_Click(object sender, EventArgs e)
{
//Установка параметров, инициализирующих видеокарты при работе. В Platforms[1] должен стоять индекс
//указывающий на используемую платформу
ComputeContextPropertyList Properties = new ComputeContextPropertyList(ComputePlatform.Platforms[1]);
ComputeContext Context = new ComputeContext(ComputeDeviceTypes.All, Properties, null, IntPtr.Zero);
//Текст програмы, исполняющейся на устройстве (GPU или CPU). Именно эта программа будет выполнять паралельные
//вычисления и будет складывать вектора. Программа написанна на языке, основанном на C99 специально под OpenCL.
string vecSum = @"
__kernel void
floatVectorSum(__global float * v1,
__global float * v2)
{
int i = get_global_id(0);
v1[i] = v1[i] + v2[i];
}
";
//Список устройств, для которых мы будем компилировать написанную в vecSum программу
List<ComputeDevice> Devs = new List<ComputeDevice>();
Devs.Add(ComputePlatform.Platforms[1].Devices[0]);
Devs.Add(ComputePlatform.Platforms[1].Devices[1]);
Devs.Add(ComputePlatform.Platforms[1].Devices[2]);
//Компиляция программы из vecSum
ComputeProgram prog = null;
try
{
prog = new ComputeProgram(Context, vecSum); prog.Build(Devs, "", null, IntPtr.Zero);
}
catch
{ }
//Инициализация новой программы
ComputeKernel kernelVecSum = prog.CreateKernel("floatVectorSum");
//Инициализация и присвоение векторов, которые мы будем складывать.
float[] v1 = new float[100], v2 = new float[100];
for (int i = 0; i < v1.Length; i++)
{
v1[i] = i;
v2[i] = 2 * i;
}
//Загрузка данных в указатели для дальнейшего использования.
ComputeBuffer<float> bufV1 = new ComputeBuffer<float>(Context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.UseHostPointer, v1);
ComputeBuffer<float> bufV2 = new ComputeBuffer<float>(Context, ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.UseHostPointer, v2);
//Объявляем какие данные будут использоваться в программе vecSum
kernelVecSum.SetMemoryArgument(0, bufV1);
kernelVecSum.SetMemoryArgument(1, bufV2);
//Создание програмной очереди. Не забудте указать устройство, на котором будет исполняться программа!
ComputeCommandQueue Queue = new ComputeCommandQueue(Context, Cloo.ComputePlatform.Platforms[1].Devices[0], Cloo.ComputeCommandQueueFlags.None);
//Старт. Execute запускает программу-ядро vecSum указанное колличество раз (v1.Length)
Queue.Execute(kernelVecSum, null, new long[] { v1.Length }, null, null);
//Считывание данных из памяти устройства.
float[] arrC = new float[100];
GCHandle arrCHandle = GCHandle.Alloc(arrC, GCHandleType.Pinned);
Queue.Read<float>(bufV1, true, 0, 100, arrCHandle.AddrOfPinnedObject(), null);
}
どうもありがとうございました!あなたの答えは私にとってとても便利です。 –