2012-08-13 3 views
3

J'essaie d'utiliser une structure de données personnalisée avec le noyau OpenCL. Je défini dans mon programme hôte une structure simple comme:Utilisation de la structure personnalisée dans opencl

struct myStruct{ 
    cl_ulong n_occ; 
    cl_ulong start_time; 
    cl_ulong end_time; 
    cl_ulong exec_time; 
    cl_ulong total_time; 
    cl_float avg_time; 
} myStruct_t; 

L'équivalent définition de la structure de données personnalisée est également fait dans mon noyau OpenCL.

struct myStruct{ 
    unsigned long n_occ; 
    unsigned long start_time; 
    unsigned long end_time; 
    unsigned long exec_time; 
    unsigned long total_time; 
    float avg_time; 
} myStruct_t; 

La fonction du noyau est la suivante:

__kernel void process_data(__global myStruct_t* input, __global myStruct_t* output){ 
    output->start_time = input->start_time; 
    output->end_time = input->end_time; 
    output->exec_time = input->end_time - input->start_time; 
    output->total_time = input->total_time + output->exec_time; 
    output->n_occ = input->n_occ + 1; 
    output->avg_time = output->total_time/output->n_occ; 
} 

J'utilise une carte Nvidia en tant que périphérique de GPU. Après l'exécution du code du noyau, j'ai obtenu des résultats incorrects. Je ne comprends pas la raison. est-ce qu'il manque quelque chose?

Merci d'avance pour votre aide.

+0

Qu'entendez-vous par "résultats incorrects"? Quelle était l'entrée, quelle est la sortie? –

+0

Travaillez-vous seulement sur une entrée et une sortie? Si oui, quelle est la raison de l'exécuter sur un noyau? Si vous le faites sur plusieurs entrées/sorties, votre code ne devrait-il pas être comme 'output [id] .start_time = input [id] .start_time;' dans votre noyau? – dkg

+0

C'était juste une simple initiation sur l'utilisation de la structure personnalisée dans OpenCL. L'étape suivante consistera à donner un grand vecteur de structure personnalisée à un noyau OpenCL. – semteu

Répondre

5

Avez-vous vérifié si votre structure hôte (C) est correctement packed (assurez-vous également que le côté OpenCL est packed correctly et que les deux indiquent la même taille)? C'est aussi une bonne idée d'utiliser les mêmes types de cl_ * dans les deux structures.

+0

Comment savoir si la structure de l'hôte et la structure côté OpenCL sont correctement empaquetées et signalent toutes les deux la même taille? Pensez-vous que je n'utilise pas les mêmes types de cl_ * dans les deux structures? Je pense que j'utilise les mêmes types. – semteu

+0

Je voulais dire - utiliser les types réels parce que c'est une meilleure pratique. Cependant, cela ne semble pas être votre problème - vous êtes certainement victime d'un artefact de rembourrage/emballage. Essayez le #pragma et le OpenCL "__attribute__ ((packed))" en premier. – Ani

+4

Un moyen simple de s'assurer que les tailles sont correctes est de déclarer un champ appelé taille en tant que tout premier champ et de remplir la valeur sur le périphérique CL. Ensuite, vérifiez la valeur renvoyée dans la structure du tampon avec celle renvoyée par "sizeof" sur l'hôte. – Ani

Questions connexes