2016-09-14 3 views
0

Я пиннинга и открепления с:биржи возлагали массива с неуправляемого указателя памяти

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», пока я его не отпишу.

+0

Зачем вам нужно что-то менять? если у вас есть неуправляемый указатель, в первую очередь нет необходимости в gchandle; просто ... обойти указатель, либо как 'byte *' (или что-то еще), либо 'IntPtr'. –

+0

Я использую объект массива много раз внутри метода вычисления. Это очень просто внутри, и я не хочу усложнять его. Когда я сделаю массив [3] = 5, он будет использовать неуправляемое пространство из alingnedAlloc –

+0

да, но в тот момент, когда вы выделили неуправляемую память, ** у вас больше нет массива **. Если у вас есть код, который говорит в терминах массивов, вам просто нужно ** изменить этот код **; теперь это неправильно. Вам нужно поговорить с точки зрения указателей. Или, надеюсь, в ближайшее время в 'Span ' (который объединяет указатели и массивы, но требует много новых трюков компилятора) –

ответ

1

Вам не нужно. GCHandle относится к управляемой памяти; неуправляемая память не требует никакого типа GCHandle. Нельзя также говорить с этой памятью, как будто это управляемый массив. Вместо этого вам нужно принять, что неуправляемые данные являются указателем и только указателем. Вы можете абстрагироваться сверху, чтобы скрыть эти детали, но это не меняет реальности. К счастью, случайному наблюдателю, разговаривая с SomeType[], очень похоже на разговор с SomeType* - пока вы проходите вокруг себя.

В будущем предстоящий Span<T> отлично справляется с объединением указателей и массивов, но это только экспериментально.

+0

Вы имеете в виду, что я должен ждать .Net 10, чтобы иметь больше производительности, не жертвуя удобочитаемостью? Но даже если это управляемая память, пиннинг останавливает ее перемещение, поэтому, если бы я мог получить внутреннюю переменную, я мог бы ее изменить, но как? Может быть, я сам подключаю gchandle и рассматриваю его содержимое как адрес памяти? –

+0

Я объявил, приколол и освободил массив в бесконечном цикле, пока его addrOpPinnedObject gchandle не станет кратным 4096, но только с размером 1000 или аналогичным. Нельзя делать с более крупными размерами, такими как 16M. Также не удалось найти «отобразить» массив в область другого массива, так что изменение первого массива можно увидеть из второго массива. –

+0

массивы @huseyintugrulbuyukisik никогда не перекрываются. Указатели могут. Кажется, вы думаете о массивах, содержащих длину и указатель, но это не так. В управляемом массиве содержимое массива * непосредственно внутри самого объекта *; по этой причине массивы и строки создаются с разной длиной. Вот почему массивы никогда не будут перекрываться: * потому что они разные объекты *. Кроме того, вы не можете использовать указатель как массив. Стиль исполнения и кодирования часто конкурируют с требованиями. Однако 'Span ' доступен сегодня в файле corefxlabs myget (но: экспериментальный/ранний) –