我有一个本地内存的问题,具体地说就是存储值的问题。这是加载到程序的文件中的所有内核。
__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);但是当我启动相关内核时,保存的值只在第一次启动时保存在本地。第二次和下一次启动是错误的数据。我尝试在每次启动前初始化本地内存,但它不起作用。队列的Create命令为:
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因此,我需要一些帮助或示例如何使用相同的本地数据在循环中运行内核?
谢谢你的帮助。
发布于 2017-02-22 00:51:50
本地内存本质上是“暂存”内存,在内核结束后不会保留其内容。您通常会在内核中将其初始化以用作手动缓存。你不能用本地内存做你想做的事情。
您可以使用常量内存来尝试加快内存访问速度。常量内存可能使用设备的实际缓存,并具有与本地相当的速度。唯一的问题是,没有办法保证(或知道)内存是否被缓存-它可能最终只是全局的。你需要进行实验。
https://stackoverflow.com/questions/42372054
复制相似问题