Java JOCL Char未返回所有Char

Java JOCL Char未返回所有Char,java,opencl,gpgpu,jocl,Java,Opencl,Gpgpu,Jocl,为什么它不能为数组中的每一个生成一个q,问号是什么?我试着改变一些东西,比如intgid=get\u global\u id(0)tointgid=get_global_id(1)最终的结果是类似于[q,,,,,,…]和[m,,,,,…]。有人能解释一下这一点,以及如何将多个chars作为输入传递给OpenCL内核吗 [?, ?, ?, ?, ?, ?, ?, ?, q, , , , , , , , ] [?, ?, ?, ?, ?, ?, ?, ?, m, , , ,

为什么它不能为数组中的每一个生成一个q,问号是什么?我试着改变一些东西,比如
intgid=get\u global\u id(0)
to
intgid=get_global_id(1)最终的结果是类似于
[q,,,,,,…]
[m,,,,,…]
。有人能解释一下这一点,以及如何将多个
char
s作为输入传递给OpenCL内核吗

[?, ?, ?, ?, ?, ?, ?, ?, q,  ,  ,  ,  ,  ,  ,  ,  ]
[?, ?, ?, ?, ?, ?, ?, ?, m,  ,  ,  ,  ,  ,  ,  ,  ]
这是可以的,除了缓冲区副本

 int n = 17;
这将读取8.5个
char
值或17个字节。java字符(2字节)和设备端字符(1字节)之间不匹配

这就是为什么您在第17个字节或第9个元素处看到正确的
q

java布尔数组也会出现类似的错误

同样,uchar16表示16字节

clEnqueueReadBuffer(commandQueue, memObjects[3], CL_TRUE, 0,
            n * Sizeof.cl_char, cArr, 0, null, null);
这需要乘以16,除非每个元素对所有16个元素都有效。如果您的意思是每16个字节包含17个元素,那么n*16应该存在,主机端(java)应该给出字节数组

这是可以的,除了缓冲区副本

 int n = 17;
这将读取8.5个
char
值或17个字节。java字符(2字节)和设备端字符(1字节)之间不匹配

这就是为什么您在第17个字节或第9个元素处看到正确的
q

java布尔数组也会出现类似的错误

同样,uchar16表示16字节

clEnqueueReadBuffer(commandQueue, memObjects[3], CL_TRUE, 0,
            n * Sizeof.cl_char, cArr, 0, null, null);

这需要乘以16,除非每个元素对所有16个元素都有效。如果您的意思是每16个字节包含17个元素,那么n*16应该在那里,主机端(java)应该给出字节数组。

最重要的一点已经在以下内容中提到:

java
char
2字节(16位)组成。在C和OpenCL中,字符是一个字节(8位)

现在还不完全清楚您的程序最终应该做什么,但正如huseyin所说的:我很确定您打算使用
char2
而不是
char16
(假设这是与UTF16相关的程序,否则,主机代码就没有意义)。此外,您似乎以某种方式混合了输入和输出数组


注: 如果您现在将其更改为使用
uchar2
,您还可能会遇到OpenCL的限制

大小小于32位的内置类型,即char、uchar、char2、uchar2、short、ushort和half具有以下限制:

写入类型为char、uchar、char2、uchar2、short、ushort和half的指针(或数组)不受支持



如果您能更清楚地描述程序应该做什么(并在这里给我一个注释,作为评论),我将尝试添加一个小示例,演示如何实现这一点。

最重要的一点已经在:

java
char
由两个字节(16位)组成。在C和OpenCL中,字符是一个字节(8位)

现在还不完全清楚您的程序最终应该做什么,但正如huseyin所说的:我很确定您打算使用
char2
而不是
char16
(假设这是与UTF16相关的程序,否则,主机代码就没有意义)。此外,您似乎以某种方式混合了输入和输出数组


注: 如果您现在将其更改为使用
uchar2
,您还可能会遇到OpenCL的限制

大小小于32位的内置类型,即char、uchar、char2、uchar2、short、ushort和half具有以下限制:

写入类型为char、uchar、char2、uchar2、short、ushort和half的指针(或数组)不受支持



如果您更清楚地描述程序应该做什么(并在这里给我一个注释,作为注释),我将尝试添加一个小示例,演示如何实现这一点。

那么我将如何向内核输入字符?如果这些字符始终是ascii字符,您可以使用字节数组。否则,将更多字节复制到缓冲区或从缓冲区复制更多字节。因此,在内核的参数中,我应该放入
u global byte*sharedByte
?内核很好,我只需要更改
char dstary[]=new char[n]
字节数组[]=新字节[n]?是和控制两侧都不超出范围。那么我如何向内核输入字符呢?如果这些字符始终是ascii字符,您可以使用字节数组。否则,将更多字节复制到缓冲区或从缓冲区复制更多字节。因此,在内核的参数中,我应该放入
u global byte*sharedByte
?内核很好,我只需要更改
char dstary[]=new char[n]
字节数组[]=新字节[n]?是,控制两侧不超出范围。它应该接受4个输入,3个
char
s和1个
float
。它根据浮点数返回后面的字母。例如,如果输入是
('a','m','t',2)
,输出将是
('c','o','v')
,因为'a'后面是2,'o'后面是'm'后面的2,'v'后面是't'。AlexJone你可以或应该通过编辑它在问题本身中描述这一点。在那里,你也有更多的空间比这里的评论。仍然不清楚您为什么使用
char16
。现在,我不知道为什么要将两个
float
数组传递给内核,当你说只需要1个float时…它应该接受4个输入,3个
char
s和1个
float
。它根据浮点数返回后面的字母。例如,如果输入是
('a','m','t',2)
,那么输出将是
('c','o','v')
,因为'a'后面是2,'o'后面是'm'后面的2,'v'后面是't'。AlexJone你可以或者应该在任务中描述这一点