ローカルメモリに問題があります。具体的にはセーブバリューです。これは、プログラムにロードされたファイル内のすべてのカーネルです。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
だから私は同じローカルデータとループ内でカーネルを実行するための方法をいくつかの助けかの例がありますか?
ありがとうございました。
私のメモリが役立つ場合、ローカルメモリのデータは波面の間に保持されません。そして私はあなたが何をしたいのか分からないと思います。 – BlueWanderer
私はデータを比較したいと思います。 1つのデータが定義され、静的および第2のデータが変更されます。だから私は高速なアクセスのためにローカルメモリに一定のデータを保存したい。私はすべての反復のためにバッファーでチャンスを取らなければならない。 –
@StepanRydloワークグループ内のすべてのスレッドは、グローバルメモリからローカルメモリにデータを収集し、同時に実行します。初期化と相関の両方を行う単一のカーネルを持つことができます。相関を開始する前に、バリアコマンドとの同期が必要です。 –