2013-05-04 116 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