2016-12-12 9 views
1

Я новичок в OpenCL. В настоящее время я работаю над большим массивом измерений. Размер массива составляет около 8 миллионов. Ниже часть моего кода:Как узнать, что сопоставление памяти успешно выполнено в OpenCL

//allocate opencl hosted memory for input 
int[] Counts = new int[8000000]; 

//get device and create context.... 

CLBuffer<Integer> memIn1 = context.createIntBuffer(Usage.Input, 8000000); 
Pointer<Integer> a = memIn1.map(queue, MapFlags.Write); 
a.setInts(Counts); 

//memory allocation for the second parameter memIn2 

CLKernel kernel = program.createKernel("gpuScoring", memIn1, memIn2, 8000000, memOut); 
kernel.enqueueNDRange(queue, new int[] {8000000}, null); 

Ниже мой код ядра:

__kernel void gpuScoring(__global int *Counts, __global int *value, int width, int height, __global int *output){ 

    int gid = get_global_id(0); 
    int x = gid % width; 
    int y = gid/width; 
    int count = Counts[y * width + x]; 
    if(count != 0){ 
     //need to do something here... 
    } 
} 

Однако, вопрос в том, что я нашел, что я никогда не могу идти в истинной ветви КРП (сосчитать! = 0). Я уверен, что массив Counts в моем коде Java имеет некоторые значения индекса, которые не равны 0. Является ли это потому, что я неправильно использовал отображение памяти? Пожалуйста помоги. Спасибо.

ответ

0

После того, как карта буфера, вы должны написать свои данные там, а затем отменить его. Вы больше похожи на создание буфера с копией данных хоста.

+0

Привет, спасибо, что ответьте. Я исправил ошибку. Да, причина в том, что я не отключил его после сопоставления, и я вычислил размер использования памяти GPU и памяти хоста неправильно. – Yangg