大概过程是这样的:我先通过linux的mmap将一个文件映射到内存中,
然后通过cudamalloc在显存申请一个相同大小的内存空间,
然后再用cudamemcpy将主机端的数据拷贝到设备端。
但是发现拷贝过去的数据好像并不完全。
以下是部分代码:
int inputfl;
int len;
char *base;
struct stat fileinfo;
char *d_data=NULL;//存储设备端分配的内存空间首地址
cudaError_t error;//错误处理
//打开文件
if ((inputfl = open("/home/hitwh/wordlist.txt",O_RDONLY,0644)) == -1) {
perror("open");
exit(1);
}
//取得文件的大小
if(fstat(inputfl,&fileinfo)==-1){
perror("fstat:");
close(inputfl);
exit(1);
}
len=fileinfo.st_size;
//printf("%d\n",len);
//映射到内存
if((base=(char *)mmap(NULL,len,PROT_READ,MAP_SHARED,inputfl,0))==MAP_FAILED){
perror("mmap");
close(inputfl);
exit(1);
}
//在显存上申请空间
error=cudaMalloc((void **)&d_data,len);
if(error!=cudaSuccess){
printf("cudamalloc returned %d->%s\n",int(error),cudaGetErrorString(error));
printf("Result=FAIL\n");
unmap(base,len,inputfl);
exit(1);
}
//将主机内存数据拷贝到显存
error=cudaMemcpy(d_data,base,len,cudaMemcpyHostToDevice);
if(error!=cudaSuccess){
printf("cudamemcpy returned %d->%s\n",int(error),cudaGetErrorString(error));
printf("Result=FAIL\n");
unmap(base,len,inputfl);
release_device_memory(d_data);
exit(1);
}
//启动内核函数
memtest<<<1,1>>>(d_data,len);
cudaDeviceSynchronize();
release_device_memory(d_data);
通过printf(“%s”,base);可以在主机端打印出预想的值,但是在设备端打印的时候内容就不完整,可能是从中间某个部分开始打印。