c - 打印推力 vector 的模板函数

标签 c templates cuda gpgpu thrust

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

相关文章:

c - 如何在C中构建具有可变列长度的表(二维数组)?

c++ - c++11标准中关于可变参数模板的困惑

c++ - CUDA:有没有办法强制每一行在继续之前完成?

c - 实现线程调度器循环和线程取消

c - 保存指针的内存地址

c++ - 模板区域中的不可推导上下文

c++ - cmake 会忽略 .hpp 文件更改吗?

c++ - 在 device_vector 上使用 thrust::iterator_adaptor 时出现问题

c - 未定义对 `setup(int, char**)' 的引用

c - C中的就地字符串反转