2013-05-14 3 views
0

Я просто пытаюсь добавить доверия :: то в моем Cuda коде, но NVCC сказать мне, что:ошибка компиляции произошла в тяге/type_traits.h

type_traits.h(322): error C2660: 'test' : function does not take 1 arguments 
type_traits.h(322): error C2866:'thrust::detail::tt_detail::is_convertible_sfinae<From,To>::value' : a const static data member of a managed type must be initialized at the point of declaration 

type_traits.h(355): error C2057: expected constant expressiontype_traits.h(363): error C2975: '__v' : invalid template argument for 'thrust::detail::integral_constant', expected compile-time constant expression 
type_traits.h(363): error C2975: '__v' : invalid template argument for 'thrust::detail::integral_constant', expected compile-time constant expression 

У меня есть поиск, что, но там, кажется, никто не получить та же проблема, как мне

часть моего кода, о тяге:

#include <thrust\sort.h> 

struct prepare_struct 
{ 
float xp; 
float yp; 
float zp; 
float xs; 
float ys; 
float zs; 
float sep; 
int idSrc_idEve; 
}; 

int compare_sort(prepare_struct &a, prepare_struct &b){ return a.sep > b.sep;} 

void func(...){ 
... 

prepare_struct* sPos_d; 
checkCudaErrors(cudaMalloc((void**)&sPos_d, n*sizeof(prepare_struct))); 

//a kernel that will fill sPos_d 

thrust::sort(sPos_d, sPos_d + n, compare_sort); 

... 
} 

Если я удалю тяги :: Sort(), это может быть скомпилирован без ошибок

Я попытался упорную :: device_vector, но он получит ту же ошибку

И raw_pointer_cast() получит такое же сообщение об ошибке слишком

Является ли это ошибка в тяге или NVCC?

или что-то не так в моем коде?

среда:

win7 x64 против 2010 CUDA 5,0 sm_20

версия device_vector:

#include <thrust/device_vector.h> 
void func(...){ 
... 

thrust::device_vector<prepare_struct> sPos_dv(n_src_sta); 
prepare_struct* sPos_d = thrust::raw_pointer_cast(sPos_dv.data()); 

//a kernel that will fill sPos_d 

thrust::sort(sPos_dv.begin(),sPos_dv.end(),compare_sort); 

... 
} 
+1

Может ли вы сделать фактический REPRO код? И почему вы используете 'cudaMalloc' вместо выделения Thrust? (вы получите ту же ошибку, но версия 'device_vector' будет более логичной) – BenC

+0

Если вы хотите знать, что не так с вашим кодом, вам действительно нужно будет показать некоторые. То, что вы разместили, таким образом, совершенно бесполезно. – talonmies

+0

Я добавляю версию device_vector. Код здесь - это ВСЕ мой код, который использует thrust, и я могу запустить целую программу с помощью std :: sort() fine. – user2380547

ответ

1

При написании пост на переполнение стека, убедитесь, что вы предоставляете Short, Self Contained, Correct (Compilable), Example (также известный как SSCCE). Это облегчит жизнь другим членам, которые пытаются вам помочь, и это также поможет вам найти фактическую ошибку в вашем коде. Если ваш код не компилируется, укажите пример, демонстрирующий проблему компиляции.

Что касается вашей программы, должны быть вещи, о которых вы нам не говорите. То, что вы пытаетесь достичь, легко обрабатывается Thrust без ошибок. Вот модифицированная (и завершенная) версия вашей программы:

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

struct prepare_struct 
{ 
    float xp; 
    float yp; 
    float zp; 
    float xs; 
    float ys; 
    float zs; 
    float sep; 
    int idSrc_idEve; 
}; 

struct prepare_struct_compare { 
    __host__ __device__ 
    bool operator() (const prepare_struct& a, const prepare_struct& b) 
    { 
    return a.sep < b.sep; 
    } 
}; 

void initialize(thrust::host_vector<prepare_struct>& v) 
{ 
    for(size_t i = 0; i < v.size(); i++) 
    v[i].sep = v.size() - i; 
} 

void print(const thrust::host_vector<prepare_struct>& v) 
{ 
    for(size_t i = 0; i < v.size(); i++) 
    std::cout << " " << v[i].sep; 
    std::cout << "\n"; 
} 

int main() 
{ 
    const int n = 10; 

    // Initialize vector of prepare_struct on host 
    thrust::host_vector<prepare_struct> vec_h(n); 
    initialize(vec_h); 
    std::cout << "Initial vector:" << std::endl; 
    print(vec_h); 

    // Copy vector to device 
    thrust::device_vector<prepare_struct> vec_d = vec_h; 

    // Sort on device 
    thrust::sort (vec_d.begin(), vec_d.end(), prepare_struct_compare()); 

    // Copy result back to host 
    thrust::host_vector<prepare_struct> res_h = vec_d; 
    std::cout << "Final vector:" << std::endl; 
    print(res_h); 
} 

Выполнение этой программы дает нам:

Initial vector: 
10 9 8 7 6 5 4 3 2 1 
Final vector: 
1 2 3 4 5 6 7 8 9 10 
+0

Извините, я не знаю о SSCCE, пока вы не скажете мне. Спасибо. Я отредактирую свою проблему. – user2380547

+0

@BenC некоторые предложения: Работает для меня! [на самом деле не ответ] (http://meta.stackexchange.com/questions/118992/are-works-for-me-answers-valid). Один из недостатков работы для меня - это то, что люди могут видеть, что вопрос имеет ответ и двигаться дальше. В этом случае я думаю, что ваш ответ спот-на, но он просто не подходит для ответа. Я тоже борюсь с этим. Мое предложение состоит в том, чтобы включить большую часть вашего ответа в качестве комментария. Если вы должны предоставить код, используйте такую ​​услугу, как pastebin.com и ссылку на нее. –

+0

@RobertCrovella: Я понимаю. Я все еще ожидаю некоторую дополнительную информацию для редактирования и завершения этого ответа. Проблема заключается в вопросе, в котором отсутствует соответствующая информация.Когда я сталкиваюсь с такой ситуацией, я обычно придерживаюсь комментариев, если не вижу нескольких важных вещей, которые могут помочь решить проблему. Здесь похоже, что одна из таких ситуаций отладки была простой «с нуля», чтобы воспроизвести код, который мог помочь ему найти ответ самостоятельно. Такой ответ кажется более полезным, чем фактическая (еще не определенная) причина его проблемы, нет? – BenC