我正在编写一个matrix
模板类,可以打印到文件和std::cout
,即:
matrix<float> myMat;
...
myMat.cout(...) // print to std::cout
myMat.write("out.txt") // print to file
两者都将共享一个共同的底层打印功能,我也试图将其作为模板实现,因为我已经看到了使用thrust::copy
将数据写入std::cout
和文件的不同示例。
下面是我所做的骨架,但目前正在输出垃圾。任何人都可以指出一些错误我可能已经做出了什么?例如,我允许这样传递std::cout
吗?
template <typename data_T> matrix {
...
template <typename out_T> int printTo(out_T &out, ...) {
data_T *start = ..., *end = ...;
...
thrust::copy(start, end, std::ostream_iterator<data_T>(out, " "));
...
}
int cout(...) {
...
printTo(std::cout, ...);
...
}
int write(char* path, ...) {
...
std::ofstream file;
file.open(path);
printTo(file, ...);
...
}
}
修改
int printTo(std::ostream &out, ...) {...}
无法解决问题。thrust::device_vector<T>
读入矩阵,比如dvec
,并将其转换为data_T
指针pvec
使用thrust::raw_pointer_cast(&dvec[0])
(因为CUBLAS库使用原始指针)。然后我在pvec
上操作然后想要打印出来。thrust::device_vector
的指针(即*dvec
)打印, 工作:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...)
。那么为什么我只能使用*dvec
迭代器而不是原始指针强制转换pvec
?答案 0 :(得分:6)
请勿在此处使用raw_pointer_cast
。这会欺骗Thrust认为你有一个指向主机上数据的指针,这就是为什么你的代码没有给你你期望的。我原以为你的代码会崩溃。
要将device_vector
复制到ostream_iterator
,请直接使用thrust::copy
:
thrust::device_vector<float> vec = ...
thrust::copy(vec.begin(), vec.end(), std::ostream_iterator<float>(std::cout, " "));