2009-10-26 15 views
0

CUDA 2.3 V0.2.1221/linux 32 bitsconvertir u_int64_t à u_char sur CUDA 2.3 nvopencc

Salut, j'ai un problème avec le code suivant:

__device__ void put_u64(void *vp, u_int64_t v) { 
u_char *p = (u_char *) vp; 

p[0] = (u_char) (v >> 56) & 0xff; 
p[1] = (u_char) (v >> 48) & 0xff; 
p[2] = (u_char) (v >> 40) & 0xff; 
p[3] = (u_char) (v >> 32) & 0xff; 
p[4] = (u_char) (v >> 24) & 0xff; 
p[5] = (u_char) (v >> 16) & 0xff; 
p[6] = (u_char) (v >> 8) & 0xff; 
p[7] = (u_char) v & 0xff; } 

= 1 émeu make compile et fonctionne

-

sans émulation je reçois l'erreur:

### échec assertion à la ligne 1923 ou ../../be/cg/cgemit.cxx

### classe registre incorrect pour opérande 0

nvopencc ERREUR INTERNE ... état 1

-

quelqu'un peut-il aider pls - je ai juste besoin d'un moyen de travail pour convertir u_int64_t à un char unsinged [7].

+0

Cependant, vous résoudre ce problème, je l'espère vous signaleront également aux développeurs Cuda à NVidia, car cela est évidemment un bogue dans Cuda. –

Répondre

1

J'ai essayé un testcase simple et il a compilé ok malheureusement. Comment sont définis u_char et u_int_64?

Je serais certainement d'accord que vous devriez signaler cela à NVIDIA, mais ils auront besoin de plus de code pour pouvoir reproduire le problème. Il peut également aider à regarder le code PTX qui est généré.

J'ai utilisé le code suivant:

#include <iostream> 
#include <algorithm> 
#include <cuda.h> 

__device__ void put_u64(void *vp, unsigned long long v) 
{ 
    unsigned char *p = (unsigned char *) vp; 
    p[0] = (unsigned char) (v >> 56) & 0xff; 
    p[1] = (unsigned char) (v >> 48) & 0xff; 
    p[2] = (unsigned char) (v >> 40) & 0xff; 
    p[3] = (unsigned char) (v >> 32) & 0xff; 
    p[4] = (unsigned char) (v >> 24) & 0xff; 
    p[5] = (unsigned char) (v >> 16) & 0xff; 
    p[6] = (unsigned char) (v >> 8) & 0xff; 
    p[7] = (unsigned char) v & 0xff; 
} 

__global__ void test(unsigned char *output, unsigned long long input) 
{ 
    put_u64(output, input); 
} 

int main(void) 
{ 
    unsigned char result[8]; 
    unsigned char *d_result; 
    unsigned long long input = 0x1212343456567878ULL; 
    cudaMalloc((void **)&d_result, 8 * sizeof(unsigned char)); 
    test<<<1,1>>>(d_result, input); 
    cudaMemcpy(&result, d_result, 8 * sizeof(unsigned char), cudaMemcpyDeviceToHost); 
    std::cout << std::hex; 
    std::copy(result, result + 8, std::ostream_iterator<int>(std::cout)); 
    std::cout << std::endl; 
} 
+0

Mais vous * êtes * NVIDIA, Tom. :) – harrism