用于打印推力矢量的模板功能

时间:2013-05-04 23:38:26

标签: c templates cuda gpgpu thrust

我正在编写一个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

1 个答案:

答案 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, " "));