OpenCL本地工作本地内存

OpenCL本地工作本地内存,c,memory,opencl,local,C,Memory,Opencl,Local,我在本地内存方面有问题,具体地说是在保存值方面。这是加载到程序的文件中的所有内核 __kernel void initData(int bitSample, int transmitorCount ,int bufferLen, __global short *sequence) { __local int constData[2]; __local short mask[(15 * 1023)]; constData[0] = bitSample; constDat

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

__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]);
}
但当我启动correlation内核时,保存的值仅在第一次启动时在本地。第二次和下一次启动是错误的数据。我尝试在每次启动之前初始化本地内存,但它不起作用。创建队列的命令是:

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 memory来尝试加快内存访问速度。常量内存很可能使用设备的实际缓存,并且速度与本地缓存相当。唯一的问题是,无法保证(或知道)内存是否被缓存——它可能最终只是全局的。您需要进行实验。

本地内存本质上是“临时”内存,在内核结束后不会保留其内容。您通常在内核中初始化它,以用作手动缓存。你不能用本地内存做你想做的事情



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

如果我的记忆有用,那么本地内存中的数据不会在波前之间保留。我想我不知道你想做什么,我想比较数据。一个数据被定义,而静态数据和第二个数据被更改。所以我想将常量数据保存到本地内存,以便更快地访问。每一次迭代我都必须有机会进行缓冲。@StepanRydlo一个工作组中的所有线程都可以从全局内存到本地内存收集数据,并且它们同时进行。因此,您可以让单个内核同时进行初始化和关联。在开始相关之前,您需要使用barrier命令进行同步。但是,如果我在一个内核中同时执行这两个操作,那么每个内核在每次启动时都会从全局内存复制到本地内存。而且它不会更快。我想在程序启动时将数据保存到局部变量。我不想改变这些数据。有可能创建它吗?我创建了新的测试,本地值保存在126次迭代中,工作组大小为128。如果我的内存可用,则本地内存中的数据不会保留在波前之间。我想我不知道你想做什么,我想比较数据。一个数据被定义,而静态数据和第二个数据被更改。所以我想将常量数据保存到本地内存,以便更快地访问。每一次迭代我都必须有机会进行缓冲。@StepanRydlo一个工作组中的所有线程都可以从全局内存到本地内存收集数据,并且它们同时进行。因此,您可以让单个内核同时进行初始化和关联。在开始相关之前,您需要使用barrier命令进行同步。但是,如果我在一个内核中同时执行这两个操作,那么每个内核在每次启动时都会从全局内存复制到本地内存。而且它不会更快。我想在程序启动时将数据保存到局部变量。我不想改变这些数据。有可能创建它吗?我创建了新的测试,本地值保存在126次迭代中,工作组大小为128。我想问一下如何创建常量全局缓冲区。我找不到任何例子。我创建缓冲区CL_MEM_READ_ONLY,并在内核中使用参数u常量short*掩码。但fast也没有什么不同。Sp如何创建常量缓冲区?如何知道常量内存是瓶颈?您检查了所有内容吗?只要常量内存小于16KB,在任何CL桌面设备中都可以。@StepanRydlo常量内存是您从主机传递给内核的不是指针的任何参数。或声明为“_常量”的指针。没有专门化为常量内存的函数。我想问一下如何创建常量全局缓冲区。我找不到任何例子。我创建缓冲区CL_MEM_READ_ONLY,并在内核中使用参数u常量short*掩码。但fast也没有什么不同。Sp如何创建常量缓冲区?如何知道常量内存是瓶颈?您检查了所有内容吗?只要常量内存小于16KB,在任何CL桌面设备中都可以。@StepanRydlo常量内存是您从主机传递给内核的不是指针的任何参数。或声明为“_常量”的指针。没有专门化为常量内存的函数。
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