4

file と の両方に出力する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, ...) {...}ても問題は解決しません。
  • 詳細情報: データを a から行列に読み込みthrust::device_vector<T>、たとえばを使用してポインターdvecに変換します(CUBLAS ライブラリは生のポインターを使用するため)。その後、操作してから印刷したいと思います。data_Tpvecthrust::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 は、ホスト上のデータへのポインターを持っていると思い込ませることができます。これが、コードが期待どおりにならない理由です。あなたのコードがクラッシュするだけだと思っていました。

device_vectoraを anにコピーするには、次のように直接ostream_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 に答える