我有一个结构
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__函数。
答案 0 :(得分:3)
您使用错误的运算符来访问数据包数组中的元素。
变化:
i = (int) packets[6]->src_ip;
^^^^
为:
i = packets[6].src_ip;
^^^
此外,不要试图通过添加随机强制转换来修复编译错误 - 它通常不是正确的解决方案 - 总是尝试理解底层问题并正确修复它。