1

これは私のヘッダーファイルの一部ですaes_locl.h:

.
.
# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) 
# define GETU32(p) SWAP(*((u32 *)(p))) 
# define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); } 
.
.

ファイルから関数.cuを宣言し、__ global__次のようなヘッダー ファイルをインクルードしました。

#include "aes_locl.h"
.....
__global__ void cudaEncryptKern(u32* _Te0, u32* _Te1, u32* _Te2, u32* _Te3, unsigned char* in, u32* rdk, unsigned long* length)
{
    u32 *rk = rdk;
    u32 s0, s1, s2, s3, t0, t1, t2, t3;

    s0 = GETU32(in + threadIdx.x*(i) ) ^ rk[0];
}

これにより、次のエラーメッセージが表示されます。

エラー: __ device__/__ global__ 関数からのホスト関数の呼び出しは、デバイス エミュレーション モードでのみ許可されます

プログラマーがその方法でマクロを正確に呼び出すサンプル コードがあります。

このように呼び出すことはできますか、それともまったく不可能ですか? そうでない場合は、マクロを書き直して目的の値を に割り当てる最善の方法についてのヒントをいただければ幸いS0です。

事前にどうもありがとうございました!!!

4

3 に答える 3

4

問題はマクロ自体ではないと思いますnvcc.CUDAコードに使用されるコンパイルプロセスは通常の方法でCプリプロセッサを実行するため、この方法でヘッダーファイルを使用しても問題ありません。問題は と の呼び出しにある_lrotlと思います_lrotr

これらの呼び出しを一時的に削除することで、それが実際に問題であることを確認できるはずです。

CUDA プログラミング ガイドをチェックして、これらの呼び出しを GPU で実行するために置き換える必要がある機能を確認する必要があります。

于 2010-07-29T07:34:37.450 に答える
2

ハードウェアには組み込みの回転命令がないため、それを公開する組み込み関数はありません (存在しないものを公開することはできません!)。

ただし、シフトとマスクを使用して実装するのはかなり簡単です。たとえば、x が 32 ビットの場合、左 8 ビットを回転させることができます。

((x << 8) | (x >> 24))

wherex << 8はすべてを 8 ビット左にプッシュ (つまり、左端の 8 ビットを破棄) し、x >> 24すべてを右に 24 ビット (つまり、左端の 8 ビット以外をすべて破棄) プッシュし、それらをビットごとに OR すると、必要な結果が得られます。

// # define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
# define SWAP(x) (((x << 8) | (x >> 24)) & 0x00ff00ff | ((x >> 8) | (x << 24)) & 0xff00ff00)

もちろん、上記がやり過ぎであることを認識することで、これをより効率的にすることができます。

# define SWAP(x) (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8))
于 2010-08-03T10:57:49.113 に答える
0

エラーは、問題が実際に何であるかを示しています。CUDA 関数内から、別のファイル (CPU コードに属する) で定義された関数/マクロを呼び出しています。不可能だよ!

GPU 関数からCPU関数/マクロ/コードを呼び出すことはできません。

nvccによってコンパイルされる同じファイル内に定義を配置する必要があります ( _lrotl()は CUDA に存在しますか?) 。

于 2010-07-28T16:17:33.413 に答える