2016-12-12 3 views
1

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.

Antwort

0

Nachdem Sie den Puffer zugeordnet haben, müssen Sie Ihre Daten dort schreiben und dann die Zuordnung aufheben. Ihre Verwendung ähnelt eher dem Erstellen des Puffers mit dem Kopieren der Host-Daten.

+0

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

Verwandte Themen