2014-06-18 2 views
0
내가 CUDA에서 sort_by_key()와 가 sort_by_key 동안 다시 주문 처리되지 않습니다 키, 단지 값 tiled_range을 사용하고

... 예를 들어추력 - 주문한 다시하지

: 키를 나타내는 벡터가 하나 있습니다 :

Keys 0 1 2 3 4 5 

나중에 tiled_range를 사용하여 값이 복제 된 새 벡터가 있습니다.

Keys 0 1 2 3 4 5  0 1 2 3 4  5  

그리고 값을 나타내는 또 다른 벡터 :

Keys  0 0  1 1  2  2  3 3 4 4  5 5 

Values 0 3382 3382 0 1863 251 470 1394 311 5651 2017 257 

내 코드 재 주문 키에 : 주문 다시

values 0 3382 1863 470 311 2017 3382 0 251 1394 5651 257 

내가 sort_by_keys로 기대되었다 같은 키 이쪽으로 ...

Keys  3 3  4 4  5  5  3 3 4 4  5 5 

Values 0 3382 3382 0 1863 251 470 1394 311 5651 2017 257 

궁금 해서요. 왜 이런 식으로 주문을 다시하는 것이고 올바른 주문을 받기 위해 무엇을 할 수 있습니까?

#include <iterator> 
#include <thrust/device_vector.h> 
#include <thrust/host_vector.h> 
#include <thrust/sort.h> 

using namespace thrust::placeholders; 

template<typename Iterator> 
class tiled_range 
//Code of tiled_range.... 
// 

int main(void) 
{ 
    thrust::device_vector<int> data(6); 
    data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5; 

    thrust::device_vector<float> values(12); 
    values[0] = 0;   values[6] = 3382; 
    values[1] = 3382;  values[7] = 0; 
    values[2] = 1863;  values[8] = 251; 
    values[3] = 470;  values[9] = 1394; 
    values[4] = 311;  values[10] = 5651; 
    values[5] = 2017;  values[11] = 257; 

    tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2); 

    std::cout << "Keys: " << std::endl; 
    thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 

    thrust::sort_by_key(keys.begin(), keys.end(), values.begin()); 

    std::cout << "Keys: " << std::endl; 
    thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 

    std::cout << "Values: " << std::endl; 
    thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " ")); 
    std::cout << std::endl; 

return 0; 

}

+2

당신은'tiled_range를 정렬 할 수 없습니다 다음 sort_by_keys에 대한 입력으로 tiled_range의 반복자를 넣어 그 위에 같은 혼란을 일으키는 이유를 나는 아직도 여기

코드입니다 ... 이해하지 않는다 '는 변경할 수 없으므로 값은 실제로 메모리의 어느 곳에도 존재하지 않습니다. 왜 예제 코드를 컴파일 할 수 있는지 모르겠다 - 그렇게해서는 안된다. 코드를 작동 시키려면 정렬을하기 전에 임시 저장 공간에'tiled_range '를 복사해야합니다. –

+0

감사합니다. 설명에 대해 자레드 (Jared). 내가 왜 컴파일하는지 이유를 모르겠다. –

답변

2

문제 해결 : 여기

는 코드! 나는 일부 코드를 확인했다 : https://groups.google.com/forum/#!msg/thrust-users/GqufHKoaizc/qx9cv-6xCg4J

그리고 나는 그들이 그것을 완벽하게 키와 값을 정렬하고,이 새로운 벡터를 복사 한 후, 다른 벡터로 tiled_range의 값을 복사하고 sort_by_keys에 넣어했다 것으로 나타났습니다.

#include <iterator> 
#include <thrust/device_vector.h> 
#include <thrust/host_vector.h> 
#include <thrust/sort.h> 

using namespace thrust::placeholders; 

template<typename Iterator> 
class tiled_range 
//Code of tiled_range.... 
// 

int main(void) 
{ 
    thrust::device_vector<int> data(6); 
    data[0] = 0; data[1] = 1; data[2] = 2; data[3] = 3; data[4] = 4; data[5] = 5; 

    thrust::device_vector<float> values(12); 
    values[0] = 0;   values[6] = 3382; 
    values[1] = 3382;  values[7] = 0; 
    values[2] = 1863;  values[8] = 251; 
    values[3] = 470;  values[9] = 1394; 
    values[4] = 311;  values[10] = 5651; 
    values[5] = 2017;  values[11] = 257; 

    tiled_range<thrust::device_vector<int>::iterator> keys(data.begin(), data.end(), 2); 
    thrust::device_vector<int> keysN(keys.begin(), keys.end()); 

    std::cout << "Keys: " << std::endl; 
    thrust::copy(keysN.begin(), keysN.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 

    thrust::sort_by_key(keysN.begin(), keysN.end(), values.begin()); 

    std::cout << "Keys: " << std::endl; 
    thrust::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 

    std::cout << "Values: " << std::endl; 
    thrust::copy(values.begin(), values.end(), std::ostream_iterator<int> (std::cout, " ")); 
    std::cout << std::endl; 

return 0; 
}