2009-10-26 46 views
0

CUDA 2.3 V0.2.1221位/ 32位的Linux转换u_int64_t对CUDA 2.3 u_char nvopencc

嗨,我有下面的代码有问题:

__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个编译和作品

-

没有仿真我得到的错误:

###断言失败在1923年线或../../be/cg/cgemit.cxx

###的数0

nvopencc内部错误......状态不正确的寄存器类别1

-

有人可以帮助请 - 我只需要一个工作方式 转换u_int64_t到unsinged字符[7]。

+0

但是你解决这个问题,我希望你也将此事报告给NVIDIA公司的CUDA开发,因为这显然是在CUDA中的错误。 – 2009-10-26 14:59:32

回答

1

我试过了一个简单的测试用例,编译好的不幸。如何定义u_char和u_int_64?

我一定会同意你应该向NVIDIA报告,但他们需要更多的代码才能重现问题。它也可能有助于查看生成的PTX代码。

我用下面的代码:

#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

但是你* * NVIDIA,汤姆。 :) – harrism 2012-09-04 04:41:50