0

CUDA 2.3 V0.2.1221 / 32bit linux

嗨,我对以下代码有疑问:

__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; }

make emu=1 编译和工作

-

没有仿真我得到错误:

### 第 1923 行或 ../../be/cg/cgemit.cxx 的断言失败

### 操作数 0 的寄存器类不正确

nvopencc 内部错误...状态 1

-

有人可以帮忙吗 - 我只需要一种将 u_int64_t 转换为 unsinged char [7] 的工作方式。

4

1 回答 1

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;
}
于 2009-11-20T15:06:48.117 回答