2017-03-06 2 views
0

추력을 사용하여 host_vector의 세 번째 위치에 하나의 값을 삽입하려고합니다.추력을 사용하여 host_vector에 삽입

static thrust::host_vector <int *> bins; int * p; bins.insert(3, 1, p);

그러나 점점 오전 오류 :

error: no instance of overloaded function "thrust::host_vector<T, Alloc>::insert [with T=int *, Alloc=std::allocator<int *>]" matches the argument list argument types are: (int, int, int *) object type is: thrust::host_vector<int *, std::allocator<int *>>

사람이 전에 본 적이, 나는이 문제를 어떻게 해결할 수 있습니까? 나는 벡터를 사용하여 정보를 GPU에 전달하려고합니다. 나는 처음에는 벡터의 벡터를 사용하여 다른 수의 데이터를 보유하는 공간 셀을 나타내지 만 추력에서는 불가능하다는 것을 알게되었습니다. 대신 공간 데이터로 정렬 된 데이터를 보유하는 벡터 bins을 사용하고 있습니다 (처음 세 값은 첫 번째 셀, 두 번째 셀은 두 번째 셀, 다음 세 번째 셀은 0 등) . 보유 된 값은 입자에 대한 포인터이며 공간 셀의 입자 수를 나타냅니다 (런타임 전에는 알 수 없음). 댓글에서 언급 한 바와 같이

+1

'통과 ​​시키면 코드가 작동하지 않습니다. st :: host_vector'를'std :: vector'와 비교해 보았습니다. 그래서 왜 그것이 추력으로 작동 할 것이라고 생각하는지 모르겠습니다. 첫 번째 인수는 반복자 (iterator)로되어 있습니다. 그래서'bins.insert (3,1, p);를'bins.insert (bins.begin() + 3, 1, p)로 변경하면, 컴파일 할 필요가 있다고 생각합니다. 표준 벡터 삽입물 [문서] (http://www.cplusplus.com/reference/vector/vector/insert/)을 공부하고 싶을 수도 있습니다. –

+1

제쳐두고, 나는 당신이 작업하기가 다소 어려운 포인터 벡터를 발견 할 것이라고 생각하지만, 당신이 묻는 질문은 아닙니다. 입자에 대한 포인터의 벡터가 아니라 단지 입자 벡터를 사용하면 내 충고가 될 것입니다. –

답변

1

, thrust::host_vectorstd::vector에 직접 모델로하고 사용하려는 조작은 컴파일 오류가 왜 위치 인수에 대한 반복자이 필요합니다.

http://en.cppreference.com/w/cpp/container/vector/insert https://thrust.github.io/doc/classthrust_1_1host__vector.html#a9bb7c8e26ee8c10c5721b584081ae065

코드의 전체 작업 예제는 다음과 같을 것입니다 보여 니펫을 : 당신은 관련 문서를 참조하는 경우이를 볼 수있는이 있어야한다는

#include <iostream> 
#include <thrust/host_vector.h> 

int main() 
{ 
    thrust::host_vector <int *> bins(10, reinterpret_cast<int *>(0)); 
    int * p = reinterpret_cast<int *>(0xdeadbeef); 
    bins.insert(bins.begin()+3, 1, p); 

    auto it = bins.begin(); 
    for(int i=0; it != bins.end(); ++it, i++) { 
     int* v = *it; 
     std::cout << i << " " << v << std::endl; 
    } 
    return 0; 
} 

참고 C++ 11 언어 기능은 nvcc에서 사용 가능합니다 (CUDA 8.0을 사용하십시오).

~/SO$ nvcc -std=c++11 -arch=sm_52 thrust_insert.cu 
~/SO$ ./a.out 
0 0 
1 0 
2 0 
3 0xdeadbeef 
4 0 
5 0 
6 0 
7 0 
8 0 
9 0 
10 0