入力をthrust::device_vector
に変換し、結果が述語を満たす場合は出力ベクトルにコピーします。したがって、結果の数は入力デバイス_ベクトルのサイズよりも小さくなります(出力ベクトルthrust::copy_if
と同様)。私はthrust :: transform_ifでこれを行う方法を見つけていません。以下の例に示すように、現在、私はthrust::transform
とthrust::remove_if
でこれを行うことができます。CUDA述語を満たす場合にのみ、変換された結果をコピーする
after adding random number:
18 4 8 7 11
after removing values greater than 6:
4
私はthrust::transform
することにより、第1、二回のメモリへの結果のコピーを避けたい:出力を与える
#include <thrust/random.h>
#include <thrust/iterator/counting_iterator.h>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/remove.h>
#include <iostream>
__host__ __device__ unsigned int hash(unsigned int a) {
a = (a+0x7ed55d16) + (a<<12);
a = (a^0xc761c23c)^(a>>19);
a = (a+0x165667b1) + (a<<5);
a = (a+0xd3a2646c)^(a<<9);
a = (a+0xfd7046c5) + (a<<3);
a = (a^0xb55a4f09)^(a>>16);
return a;
};
struct add_random {
__host__ __device__ add_random() {}
__device__ int operator()(const int n, const int x) const {
thrust::default_random_engine rng(hash(n));
thrust::uniform_int_distribution<int> uniform(0, 11);
return uniform(rng)+x;
}
};
struct is_greater {
__host__ __device__ bool operator()(const int x) {
return x > 6 ;
}
};
int main(void) {
int x[5] = {10, 2, 5, 3, 0};
thrust::device_vector<int> d_x(x, x+5);
thrust::transform(
thrust::counting_iterator<int>(0),
thrust::counting_iterator<int>(5),
d_x.begin(),
d_x.begin(),
add_random());
std::cout << "after adding random number:" << std::endl;
std::ostream_iterator<int> o(std::cout, " ");
thrust::copy(d_x.begin(), d_x.end(), o);
std::cout << std::endl;
thrust::device_vector<int>::iterator new_end(thrust::remove_if(d_x.begin(), d_x.end(), is_greater()));
std::cout << "after removing values greater than 6:" << std::endl;
thrust::copy(d_x.begin(), new_end, o);
std::cout << std::endl;
return 0;
}
上記の例ではthrust::remove_if
となります。 1つの変換関数で上記の出力を得ることは可能ですか?これどうやってするの?私の最大の関心事は計算コストです。したがって、Thrustライブラリを使用しなくても、最適化されたソリューションはすばらしいでしょう。
あなたがC++ 11を使用している場合、あなたはそのように推力のveeery長い行が呼び出しを簡素化することができます:http://coliru.stacked-crooked.com/a/1baaf80b682eb71c –
は、あなたにそれをロバートCrovellaありがとうございましたthrust :: copy_ifでd_rをd_xに置き換えた場合でも動作します。これはまさに私が望むものです。 –
m.s.私はC + + 11を使用しています、それは素敵なトリックです! –