Java, метод для закрепления и выравнивания массива
Могу ли я создать целочисленный массив с определенным выравниванием и остановить его перемещение?
int [] arr = stopGcAndPageAlign(new int[1024]);
or
int [] arr = pin(align(new int[1024],4096));
так что я могу использовать его как источник программы opencl, используя USE_HOST_PTR(для этого требуется выравнивание страницы или какое-то большое число, например 4096-alignment)
Когда я создаю массив длиной 4M, он имеет высокую вероятность хорошего выравнивания, но когда массив короче, он выравнивается и opencl терпит неудачу.
Мне нужен метод, чтобы получить простой массив Java, а затем сделать его закрепленным и выровненным (как в прямом байтовом буфере), не заходя в JNI. Стоит ли вместо этого оборачивать прямой байтовый буфер как неуправляемый массив Java? (Но это будет сложнее, может быть?)
В C# есть вариант с маршалом, может быть, у java есть что-то похожее?
Могу ли я сказать GC прекратить управление этим и перейти в какое-нибудь пустое / выровненное место для меня?
Может ли код ниже работать всегда?
// can java move the second array right at ending of first one or starting of next page?
public class MyAlignedArrayWrapper
{
public int [] alignerArray;
public int [] alignedArray;
public MyAlignedArrayWrapper()
{
alignerArray=new int[1024*1024*32]; // forces below alignment
alignedArray=new int[113]; // so this is page aligned
// at least
}
public int[] getArray()
{
return alignedArray;
}
}
Я думаю, что некоторые ребята из Java отчаянно ждут этого, чтобы добавить еще большую скорость своим приложениям, но без необходимости использовать больше памяти, чем требуется для заполнения.