Opencl 发送非32位对齐数据时排队WriteBuffer锁定

Opencl 发送非32位对齐数据时排队WriteBuffer锁定,opencl,Opencl,我正在从事一个opencl项目,我遇到了一个问题,如果我尝试将数据从cpu发送到全局内存,有时它会锁定应用程序。这种情况偶尔发生。我可以连续运行它x次,下次它锁定。只有当我尝试发送非32位宽的数据时,才会出现这种情况。例如,我可以很好地发送float和int,但当我尝试short、char或half时,就会得到随机锁定。它不会因为初始化不好的数据或其他东西而消亡,因为它确实在运行,只是不是一直在运行。我还进行了一些登录,发现它总是在尝试编写一个非标准大小的数据数组之后锁定。我在英伟达GeForc

我正在从事一个opencl项目,我遇到了一个问题,如果我尝试将数据从cpu发送到全局内存,有时它会锁定应用程序。这种情况偶尔发生。我可以连续运行它x次,下次它锁定。只有当我尝试发送非32位宽的数据时,才会出现这种情况。例如,我可以很好地发送float和int,但当我尝试short、char或half时,就会得到随机锁定。它不会因为初始化不好的数据或其他东西而消亡,因为它确实在运行,只是不是一直在运行。我还进行了一些登录,发现它总是在尝试编写一个非标准大小的数据数组之后锁定。我在英伟达GeForce GT 330M上跑步。下面是我正在运行以发送数据的代码片段。我在主机端使用C++接口。
cl_half *m_aryTest;

shared_ptr< cl::Buffer > m_bufTest;

m_aryTest = new cl_half[m_iNeuronCount];

m_bufTest = shared_ptr<cl::Buffer>( new cl::Buffer(m_lpNervousSystem->ActiveContext(), CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(m_aryTest)*m_iNeuronCount, m_aryTest));


kernel.setArg(8, *(m_bufTest.get()));


printf("m_bufTest.\n");

m_lpQueue->enqueueWriteBuffer(*(m_bufTest.get()), CL_TRUE, 0, sizeof(m_aryTest)*m_iNeuronCount,  m_aryTest, NULL, NULL);
cl_半*m_试验;
共享的ptrm_bufTest;
m_aryTest=新的cl_一半[m_iNeuronCount];
m_bufTest=shared_ptr(新cl::Buffer(m_lpNervousSystem->ActiveContext(),cl_MEM_READ_ONLY | cl_MEM_USE_HOST_ptr,sizeof(m_aryTest)*m_iNeuronCount,m_aryTest));
setArg(8,*(m_bufTest.get());
printf(“m_bufTest.\n”);
m_lpQueue->enqueueWriteBuffer(*(m_bufTest.get()),CL_TRUE,0,sizeof(m_aryTest)*m_iNeuronCount,m_aryTest,NULL,NULL);
有人知道为什么会这样吗?
谢谢

这可能是Cuda框架中的一个bug。可以肯定的是,尝试用最少的程序复制这种行为,并将其提交到官方的bug报告工具或论坛上。“sizeof(m_aryTest)”您可能希望使其成为“sizeof(*m_aryTest)”或“sizeof(cl_half)”!您在这里查找指针的大小,这是一个缓冲区溢出,因为它大于一半。可能不是您的问题的原因,但无论如何您都应该解决它。