0

私は構造を持っています

struct packet
{
    int src_ip;
    int dest_ip;
    int src_port;
    int dest_port;
    int protocol;
};

cuda カーネルは次のとおりです。

__global__ 
void GPU(struct packet * packets,int * gpu_action)
{
    int i;
    i = (int) packets[6]->src_ip;
}

主な機能は次のとおりです。

int main ()
{

    int * gpu_action;
    struct packet * gpu_packets;
    struct packet * cpu_gpu_packets;
    int * action;

    action = (int *)malloc(TOTAL_PACKETS*sizeof(int));
    cpu_gpu_packets = (struct packet *)malloc(TOTAL_PACKETS*sizeof(struct packet));
    cudaMalloc((void**)&gpu_action,TOTAL_PACKETS*sizeof(int));
    cudaMalloc((void**)&gpu_packets,TOTAL_PACKETS*sizeof(struct packet));
    cudaMemcpy(gpu_packets,cpu_gpu_packets,TOTAL_PACKETS*sizeof(struct packet),cudaMemcpyHostToDevice);
    GPU<<<1,1>>>(gpu_packets,gpu_action);

}

nvcc を使用してコンパイルすると、エラーと警告が表示されます。次の時点で「式は完全なオブジェクト型へのポインターである必要があります」というエラーが表示されます

    i = packets[6]->src_ip;

構文に何か問題がありますか?? 上記のコードは、ホスト関数では正常に機能しますが、cuda __global__ 関数では機能しません。

4

1 に答える 1

3

パケットの配列内の要素にアクセスするために間違った演算子を使用しています。

変化する:

i = (int) packets[6]->src_ip;
                   ^^^^

に:

i = packets[6].src_ip;
             ^^^

また、ランダム キャストを追加してコンパイル エラーを修正しようとしないでください。通常、これは適切な解決策ではありません。常に根本的な問題を理解し、適切に修正するようにしてください。

于 2013-09-08T07:10:18.963 に答える