Question

Est-il possible d'utiliser des types personnalisés dans le noyau OpenCL comme types de gmp (de mpz_t, mpq_t, ...)?

Pour avoir quelque chose comme ça (ce noyau ne construit pas seulement à cause de #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]);
}

Peut-être en ajoutant des arguments différents pour le quatrième paramètre ( Options ) de clBuildProgram?

Ou est-ce OpenCL ont déjà des types qui peuvent gérer grand chiffres?

Était-ce utile?

La solution

Vous pouvez utiliser des types personnalisés, mais quoi que ce soit utilisé dans le noyau doit être spécifiquement écrit pour OpenCL. Consultez ce site Web peut-être pour savoir comment mettre en œuvre un plus grand nombre de précision: FP128

Edit:. CUDA SDK de NVIDIA a un type de données de nombre complexe, ce n'est pas idéal, mais peut vous donner quelques idées sur la façon dont ils vont à ce sujet, OpenCL devrait être similaire

Autres conseils

Généralement, vous pouvez utiliser tous les types dans un programme OpenCL. Mais étant donné que les importations ne fonctionnent pas, vous devez les redéfinir dans le même programme. Par exemple:

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;
}

Cependant, il faut évidemment garder les définitions et à l'extérieur à l'intérieur même OpenCL. Assurez-vous également que le type a la même taille sur les deux périphérique et l'hôte (en utilisant un sizeof(my_struct) devrait faire l'affaire). Dans certains cas, je devais ajuster les définitions, avoir des tailles correspondantes.

je la réponse de VHristov et le commentaire de Dietr pour obtenir travail à moi. Ce code fonctionne pour moi dans OpenCL 1.2

kernel

typedef struct tag_my_struct{
  int a;
  char b;
}my_struct;

__kernel void myKernel(__global my_struct *myStruct)
{
    int gid = get_global_id(0);
    (myStruct+gid)->a = gid;
    (myStruct+gid)->b = gid + 1;
}

host

typedef struct tag_my_struct{
  cl_int a;
  cl_char b;
}my_struct;

void runCode() 
{
    cl_int status = 0;
    my_struct* ms = new my_struct[5];

    cl_mem mem = clCreateBuffer(*context, 0, sizeof(my_struct)*5, NULL, &status);
    clEnqueueWriteBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, &ms, 0, NULL, NULL);

    status = clSetKernelArg(*kernel, 0, sizeof(ms), &mem);

    size_t global[] = {5};
    status = clEnqueueNDRangeKernel(*queue, *kernel, 1, NULL, global, NULL, 0, NULL, NULL);

    status = clEnqueueReadBuffer(*queue, mem, CL_TRUE, 0, sizeof(my_struct)*5, ms, 0, NULL, NULL);

    for(int i = 0; i < 5; i++)
        cout << (ms+i)->a << " " << (ms+i)->b << endl;
}

sortie

0 ☺

1 ☻

2 ♥

3 ♦

4 ♣

Si vous voulez inclure des fichiers d'en-tête dans le fichier du noyau, vous pouvez ajouter le -l dir comme argument de clBuildProgram, où dir est le répertoire avec les fichiers d'en-tête .

Plus d'explications ici: inclure les en-têtes de fichier OpenCL .cl

Source: http: // www .khronos.org / registre / cl / sdk / 1.0 / docs / homme / xhtml / clBuildProgram.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top