Действительно ли возможно использовать пользовательские типы в ядре 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 уже имеет типы, которые могут обработать большие количества?
Вы можете использовать собственные типы, но все, что используется в ядре, требует быть специально написанным для OpenCL. Посетите этот веб-сайт, возможно, чтобы узнать, как реализовать числа с большей точностью: FP128
Изменить: NVIDIA CUDA SDK имеет тип данных сложного числа, он не идеален, но может дать вам некоторые идеи о том, как они это делают, OpenCL должен быть похожим.
Обычно вы можете использовать любые типы в программе 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)
должно помочь). В некоторых случаях мне приходилось корректировать определения, чтобы они соответствовали размерам.