2009-10-26 43 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