我正在写一个 matrix
打印到文件和 std::cout
的模板类,即:
matrix<float> myMat;
...
myMat.cout(...) // print to std::cout
myMat.write("out.txt") // print to file
两者将共享一个公共(public)的底层打印函数,我也试图将其实现为一个模板,因为我看到了使用 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
?
最佳答案
不要在这里使用 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, " "));
关于c - 打印推力 vector 的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379959/