繁体   English   中英

OpenCL本地工作本地内存

[英]OpenCL local work local memory

我的本地内存有问题,具体来说就是保存值。 这是文件中加载到程序中的所有内核。

__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

所以我需要一些帮助或示例,如何使用相同的本地数据循环运行内核?

感谢帮助。

本地内存本质上是“临时”内存,在内核结束后不会保留其内容。 您通常在内核内部对其进行初始化,以用作手动缓存。 您无法使用本地内存执行您想做的事情。

您可以使用const内存来尝试加快内存访问速度。 const内存可能会使用设备的实际缓存,并且速度与本地内存相当。 唯一的问题是没有办法保证(或知道)是否缓存了内存-它可能最终只是全局的。 您需要进行实验。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM