Я пиннинга и открепления с:биржи возлагали массива с неуправляемого указателя памяти
GCHandle pinArray(object a)
{
return GCHandle.Alloc(a, GCHandleType.Pinned);
}
void unpinArray(GCHandle h)
{
h.Free();
}
до и после метода OpenCL так массив не двигается при расчете на него. Теперь мне нужно обменивать указатель на массив массива с выровненным неуправляемым указателем на массив, чтобы иметь на нем более быстрые операции чтения/записи.
Но я не мог найти ничего подобного «изменить значение указателя массива gchandle».
мне нужно что-то вроде метода «обмена»:
GCHandle h=pinArray(array);
// how to?
IntPtr oldBackingArray=exchange(h,alignedMallocCSpace(10000000,4096));
// unmanaged operations
copyValues(h,oldBackingArray);
compute(array,...); // only passing with "array" for simplicity everywhere
array[3]=5;
l=array.toList();
compute(array,....);
Console.WriteLine(array[3]);
copyValues(oldBackingArray,h);
freeCSpace(exchange(h,oldBackingArray));
unpinArray(h);
делает это необходимость отражения и изменять эту переменную? Есть также много методов C#, использующих эти массивы внутри метода вычисления, так что это даст больше скорости даже на C# пространстве тоже? Поэтому я хочу, чтобы C# использовала пространство alignedAlloc для всего, используя объект «array», пока я его не отпишу.
Зачем вам нужно что-то менять? если у вас есть неуправляемый указатель, в первую очередь нет необходимости в gchandle; просто ... обойти указатель, либо как 'byte *' (или что-то еще), либо 'IntPtr'. –
Я использую объект массива много раз внутри метода вычисления. Это очень просто внутри, и я не хочу усложнять его. Когда я сделаю массив [3] = 5, он будет использовать неуправляемое пространство из alingnedAlloc –
да, но в тот момент, когда вы выделили неуправляемую память, ** у вас больше нет массива **. Если у вас есть код, который говорит в терминах массивов, вам просто нужно ** изменить этот код **; теперь это неправильно. Вам нужно поговорить с точки зрения указателей. Или, надеюсь, в ближайшее время в 'Span' (который объединяет указатели и массивы, но требует много новых трюков компилятора) –