2017-02-21 49 views
0

我对本地内存有问题,具体是保存值。这是加载到程序中的所有内核。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 

所以我需要一些帮助,或者例如如何在同一本地数据循环中运行的内核?

感谢您的帮助。

+0

如果我的记忆服务,本地存储器中的数据不保留在波前。我想我不知道你想做什么。 – BlueWanderer

+0

我想比较数据。一个数据被定义,静态和第二个数据被改变。所以我想将常量数据保存到本地内存以加快访问速度。每次迭代我都有机会进入缓冲区。 –

+0

@StepanRydlo工作组中的所有线程都可以将数据从全局内存收集到本地内存,并且它们可以同时进行。所以你可以让单个内核同时进行初始化和关联。在开始关联之前,您需要与屏障命令同步。 –

回答

2

本地内存实质上是“scratch”内存,并且在内核结束后不保留其内容。您通常在内核中初始化它以充当手动缓存。你不能做你想用本地内存来做的事情。

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

+0

我想问如何创建恒定的全局缓冲区。我没有找到任何例子。我创建缓冲区CL_MEM_READ_ONLY,并在内核中使用参数__constant short * mask。但快速没有什么不同。 Sp如何创建持续缓冲区? –

+0

你怎么知道持续记忆是瓶颈?你检查了一切吗? –

+0

只要恒定内存小于16KB,在任何CL桌面设备中都应该没问题。 – DarkZeros