"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 种可能的方法:
- 显式复制
D[i]
到一个宿主变量,thrust 已经为此定义了一个合适的方法。
- 在打印之前将推力
device_vector
复制回 host_vector
。
- 使用 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
。这会影响性能,因此您可能希望对大型向量使用定义的复制操作。
尽管在 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 种可能的方法:
- 显式复制
D[i]
到一个宿主变量,thrust 已经为此定义了一个合适的方法。 - 在打印之前将推力
device_vector
复制回host_vector
。 - 使用 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
。这会影响性能,因此您可能希望对大型向量使用定义的复制操作。