在OpenCL的循环中在主机和内核代码的变量之间传递值
由于某些向量数据类型,我在主机代码和内核代码之间传递值时遇到了麻烦。下面的代码/解释仅用于引用我的问题,我的代码更大、更复杂。通过这个小例子,我希望能够解释我遇到的问题。如果还需要什么,请告诉我在OpenCL的循环中在主机和内核代码的变量之间传递值,opencl,Opencl,由于某些向量数据类型,我在主机代码和内核代码之间传递值时遇到了麻烦。下面的代码/解释仅用于引用我的问题,我的代码更大、更复杂。通过这个小例子,我希望能够解释我遇到的问题。如果还需要什么,请告诉我 std::vector<vector<double>> output; for (int i = 0;i<2; i++) { auto& out = output[i]; sum =0; for (int l =0;l<3;l++) {
std::vector<vector<double>> output;
for (int i = 0;i<2; i++)
{
auto& out = output[i];
sum =0;
for (int l =0;l<3;l++)
{
for (int j=0;j<4; j++)
{
if (some condition is true)
{ out[j+l] = 0.;}
sum+= .....some addition...
}
out[j+l] = sum
}
}
然后,我设置了参数
cl::SetKernelArg(0, out);
然后循环
for (int i = 0,i<2, i++)
{
auto& out = output[i];
// sending some more arguments(which are changing accrding to loop) for sum operations
queue.enqueueNDRangeKernel(.......)
queue.enqueuereadbuffer(.....,&out,...)
}
现在,在if条件下,out[j+l]在循环中得到0。所以out值是有规律地变化的。在普通代码中,它是指向向量的引用指针。在内核和主机代码期间,我无法从输出中读取中的值。我想为每个输出[j+l]读取输出[I]中的值。但我对这个缓冲区和向量感到困惑
为了进一步澄清,output是向量的向量,out是输出向量的参考向量。我需要为输出中的每个更改更新输出中的值。因为这些是向量,所以我将作为cl缓冲区传递出去。我希望这是清楚的。
请让我知道,如果代码是必需的,我会尽力提供尽可能多的 您正在向opencl发送向量指针(当然,它们在指针级别上是连续的),但整个数据在内存中不是连续的,因为每个内部向量指向不同的内存区域。Opencl无法将主机指针映射到设备内存,并且此api中没有此类命令
您可以使用数组向量(最新版本)或纯数组。您正在向opencl发送向量指针(当然,它们在指针级别上是连续的),但整个数据在内存中不是连续的,因为每个内部向量指向不同的内存区域。Opencl无法将主机指针映射到设备内存,并且此api中没有此类命令
您可以使用数组向量(最新版本)或纯数组。turgul buyukisik-我不太懂!!你是说用数组的向量代替向量的向量。我将作为内存缓冲区发送出去,对于每次更新输入输出,我都要更新输出[i]。你能再解释一下吗?是否可以使用输出作为缓冲区并直接将值存储在内核代码中?例如,第一个向量元素数据在100到200之间。然后,第二个矢量元素数据介于5000和5100之间。但它们的指针在内存中是连续的,有些像50和51,但数据在100-200和5000-5100,缓冲区需要一些像100-200和200-300。您应该使用数组或数组的向量(最新的C++版本)。如果您正在动态构建数据,那么您可以仅在需要时使用较大的数组来更改数组,并对较小的数据使用相同的数组。谢谢,我理解了您的意思。但是我有很多变量的问题。如果可以,请参考问题。turgul buyukisik-我不太明白!!你是说用数组的向量代替向量的向量。我将作为内存缓冲区发送出去,对于每次更新输入输出,我都要更新输出[i]。你能再解释一下吗?是否可以使用输出作为缓冲区并直接将值存储在内核代码中?例如,第一个向量元素数据在100到200之间。然后,第二个矢量元素数据介于5000和5100之间。但它们的指针在内存中是连续的,有些像50和51,但数据在100-200和5000-5100,缓冲区需要一些像100-200和200-300。您应该使用数组或数组的向量(最新的C++版本)。如果您正在动态构建数据,那么您可以仅在需要时使用较大的数组来更改数组,并对较小的数据使用相同的数组。谢谢,我理解了您的意思。但是我有很多变量的问题。如果可以,请参考问题。
for (int i = 0,i<2, i++)
{
auto& out = output[i];
// sending some more arguments(which are changing accrding to loop) for sum operations
queue.enqueueNDRangeKernel(.......)
queue.enqueuereadbuffer(.....,&out,...)
}
__kernel void sumout(__global double* out, ....)
{
int l = get_global_id(0);
int j = get_global_id(1);
if (some condition is true)
{ out[j+l] = 0.; // Here it goes out of the loop then
return}
sum+= .....some addition...
}
out[j+l] = sum
}