4

我正在编写一个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>:我从 a 将数据读入矩阵,然后使用(因为 CUBLAS 库使用原始指针)dvec将其转换为data_T指针。然后我操作,然后想打印出来。pvecthrust::raw_pointer_cast(&dvec[0])pvec
  • 我试过thrust::device_vector直接从原始指针(即*dvec)打印,它确实有效:thrust::copy((*dvec).begin(), (*dvec).begin() + n ...). 那么为什么我只能使用*dvec迭代器而不是原始指针强制复制pvec呢?
4

1 回答 1

7

不要raw_pointer_cast在这里使用。这会使 Thrust 误以为您在主机上有一个指向数据的指针,这就是为什么您的代码没有提供您所期望的。我原以为您的代码会崩溃。

要将 a 复制device_vectorostream_iterator,只需thrust::copy直接使用:

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

thrust::copy(vec.begin(), vec.end(), std::ostream_iterator<float>(std::cout, " "));
于 2013-05-05T01:12:58.237 回答