перегрузка оператора в Cuda

Я успешно создал оператор + между двумя float4, выполнив:

__device__ float4 operator+(float4 a, float4 b) {
 // ...
}

Однако, если, кроме того, я хочу иметь оператор + для uchar4, делая то же самое с uchar4, я получаю следующую ошибку: «ошибка: более одного экземпляра перегруженной функции «оператор +» имеет связь «C» "

Я получаю похожее сообщение об ошибке, когда объявляю несколько функций с одинаковым именем, но разными аргументами. Итак, два вопроса:

  • Полиморфизм: возможно ли иметь несколько функций с одинаковым именем и разными аргументами в Cuda? Если да, то почему у меня появляется это сообщение об ошибке?
  • оператор+ для float4: кажется, что эта функция уже включена путем включения "cutil_math.h", но когда я включаю это (#include <cutil_math.h>), он жалуется, что такого файла или каталога нет... что-то особенное Я должен делать ? Примечание. Я использую pycuda, cuda для python.

Спасибо!


person nbonneel    schedule 05.11.2012    source источник


Ответы (1)


Обратите внимание на «имеет связь «C»» в ошибке. Вы компилируете свой код со связью C (pyCUDA делает это по умолчанию, чтобы обойти проблемы с искажением символов). C++ не может поддерживать несколько определений одного и того же имени функции с помощью компоновки C.

Решение состоит в том, чтобы скомпилировать код без автоматически сгенерированного «внешнего C» и явно указать связь C только для ядер. Таким образом, ваш код будет выглядеть примерно так:

__device__ float4 operator+(float4 a, float4 b) { ... };

extern "C"
__global__ void kernel() { };

вместо стандартного pyCUDA:

extern "C" 
{
     __device__ float4 operator+(float4 a, float4 b) { ... };

     __global__ void kernel() { };
}

pycuda.compiler.SourceModule имеет параметр no_extern_c, который можно использовать для управления тем, генерируется ли extern "C" системой компиляции точно в срок или нет.

person talonmies    schedule 05.11.2012
comment
Большое спасибо, это имеет смысл! Я попробую это как можно скорее. Но как изменить способ компиляции кода pyCuda? - person nbonneel; 07.11.2012
comment
@WhitAngl: Извините, я забыл добавить это в ответ. Взгляните на мою правку. - person talonmies; 07.11.2012