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

-

誰かがplsを助けることができます-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 に答える