Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenCL的循环中在主机和内核代码的变量之间传递值_Opencl - Fatal编程技术网

在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
}