2017-09-26 6 views
0

Im une programmation OpenCL via pyopenCL sur un Ubuntu 16.04.3 64bit, sur Nvidia Tesla K10.G2.8GB. Jusqu'à présent, tout fonctionne correctement tant que je n'inclue pas les fichiers d'en-tête dans mon noyau OpenCL. Dès, que je mets #include <stdlib.h> au-dessus de mon fichier d'en-tête, la compilation de mes grains de OpenCL échoue avec différents fichiers manquants, parmi eux étantInclure les entêtes OpenCL (32bit vs 64bit)

gnu/stubs-32.h 
sys/cdefs.h 

la recherche de ce problème, apporte des réponses comme

Error "gnu/stubs-32.h: No such file or directory" while compiling Nachos source code

ou

https://askubuntu.com/questions/470796/fatal-error-sys-cdefs-h-no-such-file-or-directory

baiscally suggérant t o installer libc6-dev-i386 ou gcc-multilib et g++-multilib, en supposant que le problème sous-jacent est un problème de 64 bits/32 bits. Ma question est, est-ce que mes binaires OpenCL pour le GPU sont compilées en binaires 32 bits (comment puis-je vérifier?)?

Si oui:

Y at-il d'autres mises en garde, quand je veux compiler les binaires 32 bits sur un système d'exploitation 64 bits? En outre: Puis-je utiliser des chargements 64 bits, lorsque mon noyau est compilé en 32 bits? (par exemple, va #pragma OPENCL EXTENSION cl_khr_fp64 : enable encore travailler?)

Si non:

Dois-je localiser manuellement/copier tous les fichiers d'en-tête nécessaires et de les inclure à la main?

En outre: Certains de mes collègues doutent même que l'inclusion d'en-têtes C standard dans les noyaux OpenCL soit possible en raison de l'absence de liens. Toute lumière à ce sujet est également appréciée.

+0

Je ne suis pas sûr, mais je pense que OpenCL pourrait bien être la langue https://www.khronos.org/files/opencl-1-2-quick-reference-card.pdf et ressources connexes: https://www.khronos.org/opencl/resources. Dans ma connaissance très limitée de PyOpenCL, je n'ai pas écrit ou vu '#include _any_library_' dans un noyau. – benshope

+0

Une recherche rapide de 'include header openCL' ici sur SO fait apparaître au moins certaines personnes qui ont inclus leurs propres en-têtes dans le code noyau OpenCL. Je parle de code noyau écrit en OpenCL C (essentiellement un sous-ensemble de C) – Dschoni

+0

Oh, oui je suppose. Juste vu celui-ci: https://stackoverflow.com/questions/14502925/include-headers-to-opencl-cl-file Je vais laisser quelqu'un qui en sait plus sur PyOpenCL répondre à votre question ... – benshope

Répondre

2

bibliothèque standard C et autres en-têtes système ne peuvent pas être inclus dans le code OpenCL C, essentiellement parce qu'ils ne sont compatibles avec le système actuel (un hôte), alors un code OpenCL C pourrait fonctionner sur un autre appareil avec un architecture différente (un GPU dans votre cas).

En remplacement de fonctions standard C, OpenCL C définit un ensemble de fonctions intégrées, qui sont disponibles sans #include: printf, un grand nombre de fonctions mathématiques, Atomics, liés à l'image fonctions, etc. .

Voir la « OpenCL Spécification: 6.12 Fonctions intégrées » pour une liste complète : https://www.khronos.org/registry/OpenCL/specs/opencl-1.2.pdf

cela ne signifie pas que vous ne pouvez pas créer un en-tête avec le code OpenCL C et #inclure il dans un programme OpenCL C Cela fonctionne très bien:

// foo.h 
void foo() { 
    printf("hello world!"); 
} 

// kernel.cl 
#include "foo.h" 
__kernel void use_foo() { 
    foo(); 
}