Ich bin neu in OpenCL. Derzeit arbeite ich an einem großen eindimensionalen Array. Die Größe des Arrays beträgt rund 8 Millionen. Das folgende ist ein Teil meines Code:Woher weiß ich, dass die Speicherzuordnung in OpenCL erfolgreich ist?
//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);
Unten ist mein Kernel-Code:
__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...
}
}
Doch die Frage ist, dass ich fand ich nie in den wahren Zweig der if (count gehen kann! = 0). Ich bin mir ziemlich sicher, dass das Counts-Array in meinem Java-Code einige Indexwerte hat, die nicht 0 sind. Liegt es daran, dass ich die Speicherzuordnung falsch verwendet habe? Bitte helfen Sie. Vielen Dank.
Hallo, danke für die Antwort. Ich habe den Fehler behoben. Ja, der Grund ist, dass ich nach dem Mapping nicht die Zuordnung aufgehoben habe und die Größe der Nutzung des GPU-Speichers und des Host-Speichers falsch berechnet habe. – Yangg