Я пытаюсь написать пользовательскую функцию для выполнения суммы. Я последовал за этот вопрос Cuda Thrust Custom function принять reference.Here как я определил мой функторпреобразование тяги, определяющее пользовательскую двоичную функцию
struct hashElem
{
int freq;
int error;
};
//basically this function adds some value to to the error field of each element
struct hashErrorAdd{
const int error;
hashErrorAdd(int _error): error(_error){}
__host__ __device__
struct hashElem operator()(const hashElem& o1,const int& o2)
{
struct hashElem o3;
o3.freq = o1.freq;
o3.error = o1.error + (NUM_OF_HASH_TABLE-o2)*error; //NUM_OF_HASH_TABLE is a constant
return o3;
}
};
struct hashElem freqError[SIZE_OF_HASH_TABLE*NUM_OF_HASH_TABLE];
int count[SIZE_OF_HASH_TABLE*NUM_OF_HASH_TABLE];
thrust::device_ptr<struct hashElem> d_freqError(freqError);
thrust::device_ptr<int> d_count(count);
thrust::transform(thrust::device,d_freqError,d_freqError+new_length,d_count,hashErrorAdd(perThreadLoad)); //new_length is a constant
Этот код на компиляции выдает следующую ошибку:
ошибка: функция «hashErrorAdd :: оператор()» не может быть вызывается с списком аргументов
типы аргументов: (hashElem)
тип объекта: hashErrorAdd
Может кто-нибудь объяснить мне, почему я получаю эту ошибку? и как я могу это разрешить. Прошу прокомментировать, если я не могу четко объяснить проблему. Спасибо.
Ой, вы правы. Я использовал другую версию преобразования, которая использует двоичную функцию. Теперь он работает отлично. Спасибо. Что касается создания указателя устройства, в документации они сделали malloc на необработанном указателе, а затем взломали необработанный указатель с устройством ptr. Я пропустил шаг malloc, чтобы просто объявить массив. –
Не могли бы вы указать в документации, где есть указатель 'malloc' на указателе, за которым следует упаковка этого указателя с помощью' device_ptr'? (Или вы имеете в виду 'cudaMalloc'?) –
Нет Я имел в виду malloc, на самом деле я прочитал его как malloc вместо« cudaMalloc »в документации. Получил ваш момент, Еще раз спасибо за указание.Я прочитал этот комментарий трижды ранее в документации, в которой говорилось «необработанный указатель на память устройства» и не смог понять, как с помощью malloc он может получить указатель на «память устройства». Раньше я думал, что этот шаг обертывания (хотя и странный) делает это. –