访问CUDA内核中的结构成员

时间:2013-09-08 07:04:54

标签: cuda

我有一个结构

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__函数。

1 个答案:

答案 0 :(得分:3)

您使用错误的运算符来访问数据包数组中的元素。

变化:

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

为:

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

此外,不要试图通过添加随机强制转换来修复编译错误 - 它通常不是正确的解决方案 - 总是尝试理解底层问题并正确修复它。