无法在cuda中将数据从设备传输到主机

无法在cuda中将数据从设备传输到主机,cuda,Cuda,我有下面一段cuda代码,我试图将数据从设备复制回主机 我不知道我到底做错了什么 #include<stdio.h> #include<stdlib.h> #define SLAB_SIZE 4 struct SlabList{ int val[SLAB_SIZE]; int key[SLAB_SIZE]; struct SlabList* next; }; void printList(struct SlabList *n

我有下面一段cuda代码,我试图将数据从设备复制回主机

我不知道我到底做错了什么

#include<stdio.h>
#include<stdlib.h>
#define SLAB_SIZE 4
struct SlabList{
        int val[SLAB_SIZE];
        int key[SLAB_SIZE];
        struct SlabList* next;
};
void printList(struct SlabList *node) {
        while (node != NULL) {
                for(int i=0;i<SLAB_SIZE;i++){
                        printf("Key: %d\tValue:%d\n",node->key[i],node->val[i]);
                }
                node = node->next;
        }
}

__global__ void insertKernel(struct SlabList* SL){
        SL->key[0]=1;
        SL->val[0]=2;
        SL->next=NULL;
}
int main(void){
int N=12;
struct SlabList* d_SL = NULL;
cudaMalloc(&d_SL, N * sizeof(struct SlabList));
insertKernel<<<1,1>>>(d_SL);
struct SlabList* head = NULL;
cudaMemcpy(head, d_SL, N * sizeof(struct SlabList), cudaMemcpyDeviceToHost);
printList(head);//here head is still NULL.
return 0;
}

#包括
#包括
#定义尺寸为4的楼板
结构SlabList{
int val[板尺寸];
int键[SLAB_SIZE];
结构SlabList*下一步;
};
无效打印列表(结构SlabList*节点){
while(节点!=NULL){
对于(int i=0;ikey[i],node->val[i]);
}
节点=节点->下一步;
}
}
__全局\uuuuvoid insertKernel(struct SlabList*SL){
SL->key[0]=1;
SL->val[0]=2;
SL->next=NULL;
}
内部主(空){
int N=12;
struct SlabList*d_SL=NULL;
cudamaloc(&d_SL,N*sizeof(struct SlabList));
插入内核(d_-SL);
struct SlabList*head=NULL;
cudaMemcpy(头部,d_SL,N*sizeof(结构SlabList),cudamemcpydevicetoost);
printList(head);//此处head仍然为空。
返回0;
}

内存不是隐式分配的。您已经在GPU内存中分配了一个数组,但尚未在CPU RAM中分配它。如果要在CPU中使用该变量,则需要创建一个新变量并分配它

...
struct SlabList* d_SL = NULL;
cudaMalloc(&d_SL, N * sizeof(struct SlabList));
struct SlabList* h_SL = NULL;

h_SL=(SlabList*)malloc(N*sizeof(struct SlabList));

cudaMemcpy(h_SL , d_SL, N * sizeof(struct SlabList), cudaMemcpyDeviceToHost);
...

还要注意命名约定
d_SL
应该表示“变量
SL
,但它在设备(GPU)上的版本”。通常,它在CPU中的对应物称为
h_SL
,或“主机
SL
”。它有助于跟踪变量

在任何时候,您都没有为
分配或初始化任何内存。你认为memcpy可能如何工作?在过去两天里,你已经问了4个CUDA问题。所有这些问题都已得到答复。正如我所能说的那样,你没有投赞成票,也没有接受任何答案。如果你两样都做就好了。接受答案可以提高他们在搜索中的可见性,让下一个有类似问题的人更容易找到答案