2015-08-14 64 views
0

我使用推力產生在GPU上一些隨機排列如下:推力::怎麼做這種情況下的選擇拷貝

// Compute a random list on CPU 
int iterations = 500; 
int src_size = 2048; 
thrust::host_vector<int> cpu_rand_list (iterations * 4); 

for(size_t i = 0; i < cpu_rand_list.size(); ++i) { 
    cpu_rand_list[i] = src_size * (rand()/(1.0 + RAND_MAX)); 
} 

// Copy the random list to GPU 
thrust::device_vector<int> gpu_rand_list = cpu_rand_list; 

現在gpu_rand_list包含一些指標的整數,我有另一個數組一樣:

thrust:;device_vector<float> values(2048); 
// These are now filled with some values 
... 

我想要做的是創造另一個列表這將只包含gpu_rand_list對應的條目中values不等於-1的條目。所以在CPU代碼類似的:

std::vector<int> refined; 
for (int i = 0; i < gpu_rand_list.size(); ++i) { 
    if (values[gpu_rand_list[i]] != -1) 
     refined.push_back(gpu_rand_list[i]); 
} 

有沒有一種方法來實現這個推力?我試圖使用copy_if構造,但不能使它與這些多個數組一起工作。

回答

2

thrust :: copy_if(特別是the stencil version,我想)是一個合理的出發點。我所看到的唯一的其他複雜性似乎是「通過」gpu_rand_list的索引。這可以通過permutation iterator完成。

(旁白:使用模板一個float陣列,當你想要做一個精確的比較-1似乎有點怪我,但也許這是有道理的。)

像這樣的事情可能會爲你工作:

$ cat t881.cu 
#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/copy.h> 
#include <thrust/iterator/permutation_iterator.h> 
#include <stdlib.h> 
#include <vector> 
#include <iostream> 

using namespace thrust::placeholders; 

int main(){ 

// Compute a random list on CPU 
    int iterations = 500; 
    int src_size = 2048; 
    thrust::host_vector<int> cpu_rand_list (iterations * 4); 

    for(size_t i = 0; i < cpu_rand_list.size(); ++i) { 
    cpu_rand_list[i] = src_size * (rand()/(1.0 + RAND_MAX)); 
    } 

// Copy the random list to GPU 
    thrust::device_vector<int> gpu_rand_list = cpu_rand_list; 
    thrust::device_vector<float> values(src_size, -1.0f); 
// pick some values to copy 
    values[2] = 0; values[3] = 0; values[5] = 0; 
    thrust::device_vector<int> result(iterations * 4); 

    thrust::copy_if(gpu_rand_list.begin(), gpu_rand_list.end(),thrust::make_permutation_iterator(values.begin(), gpu_rand_list.begin()), result.begin(), _1 != -1.0f); 
    std::vector<float> h_values(src_size); 
    thrust::copy(values.begin(), values.end(), h_values.begin()); 
    thrust::host_vector<int> h_result = result; 
    std::vector<int> refined; 
    for (int i = 0; i < cpu_rand_list.size(); ++i) { 
    if (h_values[cpu_rand_list[i]] != -1) 
     refined.push_back(gpu_rand_list[i]); 
    } 
    for (int i = 0; i < refined.size(); i++) 
    if (refined[i] != h_result[i]) { std::cout << "mismatch at: " << i << "was: " << h_result[i] << "should be: " << refined[i] << std::endl; return 1;} 
    else std::cout << refined[i] << std::endl; 
    return 0; 

} 
$ nvcc -o t881 t881.cu 
$ ./t881 
2 
5 
5 
$ 

(我使用thrust placeholders所以我沒有創建爲copy_if操作的明確的函子。)