2010-11-15 3 views
3

J'utilise nvcc pour compiler un noyau CUDA. Malheureusement, nvcc ne semble pas supporter uint8_t, bien qu'il supporte int8_t (!). Je n'utiliserais pas non plus unsigned char, pour des raisons de portabilité, de lisibilité et de santé mentale. Y a-t-il une autre bonne alternative?Quelle est une bonne alternative à uint8_t quand il n'est pas fourni par le compilateur?


Juste pour éviter tout malentendu possible, voici quelques détails.

$ nvcc --version 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2010 NVIDIA Corporation 
Built on Mon_Jun__7_18:56:31_PDT_2010 
Cuda compilation tools, release 3.1, V0.2.1221 

code contenant

int8_t test = 0; 

est très bien, mais le code contenant

uint8_t test = 0; 

renvoyait un message d'erreur comme

test.cu(8): error: identifier "uint8_t" is undefined 

Répondre

19

Les types entiers C99 ne sont pas "définis par le compilateur". Ils sont définis dans <stdint.h>.

Essayez:

#include <stdint.h> 
+1

Merci. La disponibilité de 'int8_t' m'a jeté. :) –

+1

Merci! Résolu grand problème pour moi –

1
typedef unsigned char uint8_t; 
1

Ce ne diffère pas de ce que Mac OS X utilise:

typedef unsigned char uint8_t; 

Quelle est votre préoccupation au sujet de la portabilité des unsigned char? Si le problème est qu'un char pourrait ne pas représenter 8 bits de stockage, vous pouvez inclure une assertion statique le long des lignes de:

typedef int Assert8BitChar[(CHAR_BIT == 8)? 0 : -1]; 

Cela entraînera la compilation à l'erreur lorsque l'hypothèse est violée.

1

Cela semble compiler très bien avec nvcc:

#include <stdint.h> 

int main() { 
    uint8_t x = 0; 
    return (int) x; 
} 
+2

Pas sur ma machine ce n'est pas, ou je n'aurais pas demandé. C'est précisément pourquoi j'ai mis tous les détails dans la question initiale - pour préciser que cela ne fonctionne pas pour moi. –

Questions connexes