我对本地内存有问题,具体是保存值。这是加载到程序中的所有内核。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);
但是,当我启动相关内核时,保存的值仅在本地启动。第二次和下一次启动是错误的数据。我尝试在每次启动之前初始化本地内存,但它不起作用。创建命令队列是:
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);
}
一个运行的结果是:
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
我想比较数据。一个数据被定义,静态和第二个数据被改变。所以我想将常量数据保存到本地内存以加快访问速度。每次迭代我都有机会进入缓冲区。 –
@StepanRydlo工作组中的所有线程都可以将数据从全局内存收集到本地内存,并且它们可以同时进行。所以你可以让单个内核同时进行初始化和关联。在开始关联之前,您需要与屏障命令同步。 –