2016-12-12 7 views
1

OpenCLを初めて使用しています。 現在、私は大きな1次元配列に取り組んでいます。アレイのサイズは約800万です。以下は、私のコードの一部です:しかし、問題は私が(数える場合の真のブランチに行くことができたということですOpenCLでメモリマッピングが成功したことを知る方法

__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... 
    } 
} 

:以下

//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); 

私のカーネルコードされます! = 0)。私のJavaコードのCounts配列には0ではないインデックス値がいくつかあることは間違いありません。助けてください。ありがとうございました。

答えて

0

バッファをマップしたら、そこにデータを書き込んでからマップを解除する必要があります。使用方法は、ホストデータをコピーしてバッファを作成する方法とよく似ています。

+0

こんにちは、返信ありがとうございます。私はバグを修正しました。はい、マッピング後にマップを解除しなかったため、GPUメモリとホストメモリの使用方法のサイズが間違って計算されました。 – Yangg

関連する問題