2017-02-21 21 views
0

ローカルメモリに問題があります。具体的にはセーブバリューです。これは、プログラムにロードされたファイル内のすべてのカーネルです。OpenCLローカルワークローカルメモリ

__kernel void initData(int bitSample, int transmitorCount ,int bufferLen, __global short *sequence) 
{ 

    __local int constData[2]; 
    __local short mask[(15 * 1023)]; 

    constData[0] = bitSample; 
    constData[1] = bufferLen; 

    for (int i = 0; i < transmitorCount * 1023; i++) { 
     mask[i] = sequence[i]; 
    } 

    printf("startPlace: %u \t Resutl: %i = %i\n", transmitorCount, constData[0], constData[1]); 
    barrier(CLK_LOCAL_MEM_FENCE); 
} 

__kernel void correlation(__global short *inBuffer, __global int *outBuffer, __local int *constData) 
{ 

    uint startPlace = get_global_id(0); 
    uint sequence = get_global_id(1); 

    outBuffer[0] = inBuffer[0]; 

    printf("startPlace: %i Sequence: %i\t Resutl: %i = %i\n", startPlace, sequence, constData[0], constData[1]); 
} 

プログラムが働いているとローカルメモリが保存されます。初期化コールは

size_t globaId[3] = { 1, 0, 0 }; 
    ret = clEnqueueNDRangeKernel(gpuControlData->cmdQueue, gpuControlData->initKernel, 1, NULL, globaId, NULL, 0, NULL, NULL); 

ですが、相関カーネルを開始すると、保存された値は最初の開始時にのみローカルになります。 2番目と次の開始は間違ったデータです。私は毎回ローカルメモリーを初期化しようとしますが、動作しません。キューにコマンドを作成している:

while(true){ 
    ret = clSetKernelArg(gpuControlData->corelationKernel, 0, sizeof(cl_mem), (void *) &inBuffer); 
    ret = clSetKernelArg(gpuControlData->corelationKernel, 1, sizeof(cl_mem), (void *)&outBuffer); 
    ret = clSetKernelArg(gpuControlData->corelationKernel, 2, sizeof(cl_int) * 2, NULL); 

    size_t globaId[3] = { 3, 2, 0 }; 
    ret = clEnqueueNDRangeKernel(gpuControlData->maskCorrelQueue, gpuControlData->corelationKernel, 2, NULL, globaId, NULL, 0, NULL, NULL); 
} 

1つの実行結果は次のとおりです。

startPlace: 2 Resutl: 100 = 150000 
startPlace: 0 Sequence: 0  Resutl: 100 = 150000 
startPlace: 1 Sequence: 0  Resutl: 100 = 150000 
startPlace: 2 Sequence: 0  Resutl: 100 = 150000 
startPlace: 0 Sequence: 1  Resutl: 100 = 150000 
startPlace: 1 Sequence: 1  Resutl: 100 = 150000 
startPlace: 2 Sequence: 1  Resutl: 100 = 150000 
oneIteration 
startPlace: 0 Sequence: 0  Resutl: 1056562655 = 1058300571 
startPlace: 1 Sequence: 0  Resutl: 1056562655 = 1058300571 
startPlace: 2 Sequence: 0  Resutl: 1056562655 = 1058300571 
startPlace: 0 Sequence: 1  Resutl: 1056562655 = 1058300571 
startPlace: 1 Sequence: 1  Resutl: 1056562655 = 1058300571 
startPlace: 2 Sequence: 1  Resutl: 1056562655 = 1058300571 

だから私は同じローカルデータとループ内でカーネルを実行するための方法をいくつかの助けかの例がありますか?

ありがとうございました。

+0

私のメモリが役立つ場合、ローカルメモリのデータは波面の間に保持されません。そして私はあなたが何をしたいのか分からないと思います。 – BlueWanderer

+0

私はデータを比較したいと思います。 1つのデータが定義され、静的および第2のデータが変更されます。だから私は高速なアクセスのためにローカルメモリに一定のデータを保存したい。私はすべての反復のためにバッファーでチャンスを取らなければならない。 –

+0

@StepanRydloワークグループ内のすべてのスレッドは、グローバルメモリからローカルメモリにデータを収集し、同時に実行します。初期化と相関の両方を行う単一のカーネルを持つことができます。相関を開始する前に、バリアコマンドとの同期が必要です。 –

答えて

2

ローカルメモリは本質的に「スクラッチ」メモリであり、カーネルの終了後も内容は保持されません。通常は、手動キャッシュとして機能するようにカーネル内で初期化します。あなたは、ローカルメモリで何をしようとしているのかはできません。

constメモリを使用すると、メモリアクセスを高速化できます。 Constメモリはデバイスの実際のキャッシュを使用する可能性が高く、ローカルに匹敵するスピードを持ちます。唯一の問題は、メモリがキャッシュされるかどうかを保証する方法がないことです。あなたは実験が必要です。

+0

私は定数グローバルバッファを作成する方法を尋ねたいと思います。私はどんな例も見つけられません。私はバッファCL_MEM_READ_ONLYを作成し、カーネルでは引数__constant short * maskを使用します。しかし、速い点で違いはありません。私はどのように定数バッファを作成する? –

+0

定数メモリがボトルネックであることをどうやって知っていますか?すべてをチェックしましたか? –

+0

定数メモリが16KB未満であれば、どのCLデスクトップデバイスでも問題ありません。 – DarkZeros