2013-05-04 62 views
3

我正在写一个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,并将其转换为使用thrust::raw_pointer_cast(&dvec[0])一个data_T指针pvec(作为CUBLAS库使用原始指针)。然后我运行pvec,然后打印出来。
  • 我试过直接从原始thrust::device_vector的指针打印(即*dvec),它确实工作:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...)。那么,为什么我只能使用*dvec迭代器而不是原始指针pvec来复制?
+0

你不需要做'printTo'一个模板函数。简单地说,第一个参数是一个'std :: ostream'引用。 – 2013-05-04 23:43:40

+0

@JoachimPileborg,谢谢 - 我已经把它改成了'int printTo(std :: ostream&out,...){...}',但它仍在输出垃圾。任何其他想法? – mchen 2013-05-04 23:49:51

+0

你如何存储“数据”?你如何实际初始化'start'和'end'? – 2013-05-04 23:55:36

回答

6

请不要在此处使用raw_pointer_cast。这会欺骗推测你已经有了一个指向主机数据的指针,这就是为什么你的代码不能给你所期望的。我会期望你的代码只是崩溃。

要将device_vector复制到ostream_iterator,只需直接使用thrust::copy

thrust::device_vector<float> vec = ... 

thrust::copy(vec.begin(), vec.end(), std::ostream_iterator<float>(std::cout, " ")); 
+0

非常感谢@JaredHoberock - 我如何存储迭代器vec.begin()?我实际上遍历了推力矢量读数据块,因为较大矩阵的子矩阵可能不会连续存储在内存中。 – mchen 2013-05-05 01:16:52

+0

您可以使用'thrust :: device_vector :: iterator i = vec.begin();'或'thrust :: device_ptr ptr = vec.data();'。 – 2013-05-05 01:18:05

+0

谢谢@JaredHoberock,但是如果我想用自己的模板类型使用迭代器:'thrust :: device_vector :: iterator i = ...'?如果我从''更改为'',我会收到一个编译错误'预计有a';''。 – mchen 2013-05-05 01:26:47