Opencl 全局内存的前缀和与本地内存的错误

Opencl 全局内存的前缀和与本地内存的错误,opencl,prefix-sum,Opencl,Prefix Sum,我有一个马里GPU,它根本不支持本地内存。 每次我运行由本地内存组成的代码时,它都会给我一些来自设备的错误。 所以,我想把我的代码转移到一个只使用全局内存的版本。 我在想,是否有可能只在GPU上使用全局内存运行前缀和/并行缩减算法 EDITED:我在调试错误时发现一个奇怪的现象,某一行给出了erorr。 我有这样的e线: `#define LOG_LSIZE 8` `#define LSIZE_SHIFT_VALUE 4` `#define LOG_NUM_BANKS 2` `#define G

我有一个马里GPU,它根本不支持本地内存。 每次我运行由本地内存组成的代码时,它都会给我一些来自设备的错误。 所以,我想把我的代码转移到一个只使用全局内存的版本。 我在想,是否有可能只在GPU上使用全局内存运行前缀和/并行缩减算法

EDITED
:我在调试错误时发现一个奇怪的现象,某一行给出了erorr。 我有这样的e线:

`#define LOG_LSIZE 8`
`#define LSIZE_SHIFT_VALUE 4`
`#define LOG_NUM_BANKS 2`
`#define GET_CONFLICT_OFFSET(lid) ((lid) >> LOG_NUM_BANKS)`
`#define LSIZE 32`
`__local int lm_sum[2][LSIZE + LOG_LSIZE]`
`**lm_sum[lid >> LSIZE_SHIFT_VALUE][bi]  +=  lm_sum[lid >>  LSIZE_SHIFT_VALUE][ai]**`
lid是本地id,我使用的是32号qork组。我发现突出显示的行是错误的原因。我尝试使用固定值,发现无法在语句右侧使用
lm_sum
。如果我这样做了,那我就错了。例如,这一行也给出了错误:
int temp=lm\u sum[0][0]

知道发生了什么事吗

错误:

`In initial.cpp***[14100.684249] Mali<ERROR, BASE_MMU>: In file: /home/jbmaster/work/01.LPD_OpenCL_RFS/01.arm_work_3_0_31/SEC_All_EVT0_TX013-BU-00001-r2p0-00rel0/TX013-BU-00001-r2p0-00rel0/driver/product/kernel/drivers/gpu/arm/t6xx/kbase/src/common/mali_kbase_mmu.c line: 1240 function:kbase_mmu_report_fault_and_kill 
[14100.709724] Unhandled Page fault in AS0 at VA 0x00000002000EC1A0
[14100.709728] raw fault status 0x500003C3
[14100.709730] decoded fault status: SLAVE FAULT
[14100.709733] exception type 0xC3: TRANSLATION_FAULT
[14100.709736] access type 0x3: WRITE
[14100.709738] source id 0x5000
[14100.734958] 
[14100.736432] Mali<ERROR, BASE_JD>: In file: /home/jbmaster/work/01.LPD_OpenCL_RFS/01.arm_work_3_0_31/SEC_All_EVT0_TX013-BU-00001-r2p0-00rel0/TX013-BU-00001-r2p0-00rel0/driver/product/kernel/drivers/gpu/arm/t6xx/kbase/src/common/mali_kbase_jm.c line: 899 function:kbase_job_slot_hardstop 
[14100.761458] Issueing GPU soft-reset instead of hard stopping job due to a hardware issue
[14100.769517] ` 
`initial.cpp***[14100.684249]马里:在文件中:/home/jbmaster/work/01.LPD\u OpenCL\u RFS/01.arm\u work\u 3\u 0\u 31/SEC\u All\u EVT0\u TX013-BU-00001-r2p0-00rel0/TX013-BU-00001-r2p0-00rel0/driver/product/kernel/drivers/gpu/arm/t6xx/kbase/src/common/Mali\kbase\u mmu.c线路:1240功能:ase\kbu\u报告mmu故障
[14100.709724]位于VA 0x00000002000EC1A0的AS0中未处理的页面错误
[14100.709728]原始故障状态0x500003C3
[14100.709730]解码的故障状态:从机故障
[14100.709733]异常类型0xC3:翻译错误
[14100.709736]访问类型0x3:写入
[14100.709738]源id 0x5000
[14100.734958] 
[14100.736432]马里:在文件中:/home/jbmaster/work/01.LPD\u OpenCL\u RFS/01.arm\u work\u 3\u 0\u 31/SEC\u All\u EVT0\u TX013-BU-00001-r2p0-00rel0/TX013-BU-00001-r2p0-00rel0/driver/product/kernel/drivers/gpu/arm/t6xx/kbase/src/common/Mali\kbase\u jm.c行:899功能:kbase
[14100.761458]由于硬件问题,发布GPU软重置而不是硬停止作业
[14100.769517] ` 

由于lm_sum[0][0]不工作,因此未分配阵列的内存。你说你的GPU不支持本地内存。嗯,您正在尝试使用声明为在本地内存中的lm_sum(u local int lm_sum[2][LSIZE+LOG_LSIZE])。

GPU不支持本地内存,这是我的假设。如果我能在左边使用lm_sum,我应该也能在右边使用它。所以你是说下面的方法有效:
lm_sum[0][0]=2
yes!那条线很好用。这可能看起来很奇怪,但这正在发生。如果不支持本地内存,它似乎不应该工作。此外,错误似乎与“写入”有关:
[14100.709736]访问类型0x3:Write
。不管怎样,为什么不声明lm_sum在全局内存中而不是在本地内存中呢?问题是访问模式和计算是使用lid完成的。如果我把lm_sum改为global,那么我就一个接一个地改变所有这些地方,我不确定输出是否正确。