Пользовательские типы в ядре OpenCL

Действительно ли возможно использовать пользовательские типы в ядре OpenCL как типы GMP (mpz_t, mpq_t, …)?

Иметь что-то вроде этого (это ядро не создает только из-за #include <gmp.h>) :

#include <gmp.h>
__kernel square(
   __global mpz_t* input,
   __global mpz_t number,
   __global int* output,
   const unsigned int count)
{
   int i = get_global_id(0);
   if(i < count)
       output[i] = mpz_divisible_p(number,input[i]);
}

Возможно, путем добавления различных аргументов четвертому параметру (опции) clBuildProgram ?

Или OpenCL уже имеет типы, которые могут обработать большие количества?

11
задан codetwiddler 12 July 2012 в 18:56
поделиться

2 ответа

Вы можете использовать собственные типы, но все, что используется в ядре, требует быть специально написанным для OpenCL. Посетите этот веб-сайт, возможно, чтобы узнать, как реализовать числа с большей точностью: FP128

Изменить: NVIDIA CUDA SDK имеет тип данных сложного числа, он не идеален, но может дать вам некоторые идеи о том, как они это делают, OpenCL должен быть похожим.

4
ответ дан 3 December 2019 в 02:10
поделиться

Обычно вы можете использовать любые типы в программе OpenCL. Но поскольку импорт не работает, вам придется заново определить его в той же программе. Например:

typedef char my_char[8];

typedef struct tag_my_struct
{
    long int        id;
    my_char         chars[2];
    int             numerics[4]
    float           decimals[4];
} my_struct;

__kernel void foo(__global my_struct * input,
                  __global int * output)
{
    int gid = get_global_id(0);
    output[gid] = input[gid].numerics[3]== 2 ? 1 : 0;
}

Однако вам, очевидно, нужно сохранить одни и те же определения внутри и вне OpenCL. Также убедитесь, что тип имеет одинаковый размер как на устройстве, так и на хосте (использование sizeof (my_struct) должно помочь). В некоторых случаях мне приходилось корректировать определения, чтобы они соответствовали размерам.

20
ответ дан 3 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: