"Warning : Non-POD class type passed through ellipsis" 用于简单推力程序

"Warning : Non-POD class type passed through ellipsis" for simple thrust program

尽管在 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;
}

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

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

  1. 显式复制 D[i] 到一个宿主变量,thrust 已经为此定义了一个合适的方法。
  2. 在打印之前将推力 device_vector 复制回 host_vector
  3. 使用 thrust::copy 直接将 device_vector 的元素复制到流中。

代码:

#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;
}

请注意,对于这些方法,thrust 正在生成各种设备-> 主机复制操作,以方便在主机代码中使用 device_vector。这会影响性能,因此您可能希望对大型向量使用定义的复制操作。