"警告:非POD类类型通过省略号"对于简单的推力计划

时间:2015-01-19 13:05:33

标签: thrust

尽管在SO上阅读了相同类型的问题的许多答案,但我无法在我的案例中找到解决方案。我编写了以下代码来实现推力计划。程序执行简单的复制和显示操作。

#include <stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>


int main(void)
{
// H has storage for 4 integers
  thrust::host_vector<int> H(4);
  H[0] = 14;
  H[1] = 20;
  H[2] = 38;
  H[3] = 46;

  // H.size() returns the size of vector H
  printf("\nSize of vector : %d",H.size());
  printf("\nVector Contents : ");
  for (int i = 0; i < H.size(); ++i) {
      printf("\t%d",H[i]);
  }

  thrust::device_vector<int> D = H;
  printf("\nDevice Vector Contents : ");
  for (int i = 0; i < D.size(); i++) {
      printf("%d",D[i]);         //This is where I get the warning.
  }

  return 0;
}

1 个答案:

答案 0 :(得分:2)

Thrust实现某些操作以便于在主机代码中使用device_vector的元素,但这显然不是其中之一。

解决此问题的方法有很多种。以下代码演示了3种可能的方法:

  1. 明确地将D[i]复制到主变量,并且推力具有为其定义的适当方法。
  2. 在打印输出之前将推力device_vector复制回host_vector
  3. 使用thrust :: copy直接将device_vector的元素复制到流中。
  4. 代码:

    #include <stdio.h>
    #include <iostream>
    #include <thrust/host_vector.h>
    #include <thrust/device_vector.h>
    #include <thrust/copy.h>
    
    
    int main(void)
    {
    // H has storage for 4 integers
      thrust::host_vector<int> H(4);
      H[0] = 14;
      H[1] = 20;
      H[2] = 38;
      H[3] = 46;
    
      // H.size() returns the size of vector H
      printf("\nSize of vector : %d",H.size());
      printf("\nVector Contents : ");
      for (int i = 0; i < H.size(); ++i) {
          printf("\t%d",H[i]);
      }
    
      thrust::device_vector<int> D = H;
      printf("\nDevice Vector Contents : ");
    //method 1
      for (int i = 0; i < D.size(); i++) {
          int q = D[i];
          printf("\t%d",q);
      }
      printf("\n");
    //method 2
      thrust::host_vector<int> Hnew = D;
      for (int i = 0; i < Hnew.size(); i++) {
          printf("\t%d",Hnew[i]);
      }
      printf("\n");
    //method 3
      thrust::copy(D.begin(), D.end(), std::ostream_iterator<int>(std::cout, ","));
      std::cout << std::endl;
    
      return 0;
    }
    

    注意,对于像这样的方法,推力产生各种装置 - &gt;主机复制操作,以方便在主机代码中使用device_vector。这会影响性能,因此您可能希望对大型矢量使用定义的复制操作。