2013-07-22 4 views
1

Я не знал, что cuda не поддерживает ссылочные аргументы. Есть эти две функции в моей программе:ссылка аргумент на Cuda

__global__ void 
    ExtractDisparityKernel ( ExtractDisparity& es) 
    { 
    es(); 
    } 

    __device__ __forceinline__ void 
    computeAdjacentValue (int x1, int y1, int x2, int y2, float& value) 
    { .... 
    } 

Учитывая глобальная функция, ошибка отчетов компилятора: /home/lv/pcl-trunk/gpu/kinfu_large_scale/src/cuda/estimate_combined.cu (959): ошибка: a глобальная процедура не может иметь опорных аргументов

Я искал некоторые решения. Кто-то говорит, что это запрещено. Но устройство не сообщает о таких ошибках. Я смущен тем, что cuda поддерживает ссылочный аргумент. Или компилятор каким-то образом обманул.

Может ли кто-нибудь дать полный ответ на эту проблему: где ссылка разрешена и не разрешена?

ответ

4

Ссылка на функцию __global__ не будет работать, потому что передача аргумента по ссылке создает указатель, который функция будет использовать для ссылки на аргумент. Однако это обычно приводит к разыменованию указателя узла на код устройства, что недопустимо.

Функция __device__ может использовать ссылочные аргументы, однако, поскольку разыменование указателя устройства в коде устройства является законным.

Что касается «решения», просто передать указатель:

ExtractDisparityKernel ( ExtractDisparity *es) 

И, конечно, убедитесь, что аргумент вы передаете это правильный cudaMalloc -created указателя.