конвертировать u_int64_t в u_char в CUDA 2.3 nvopencc - PullRequest
0 голосов
/ 26 октября 2009

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 в незапятнанный символ [7].

1 Ответ

1 голос
/ 20 ноября 2009

Я попробовал простой тестовый пример, и он скомпилирован нормально, к сожалению. Как определяются 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;
}
...