我正在尝试创建一个包含uint32_ts的映射内存文件,然后将其用作 CUDA 的零拷贝固定内存,如下所示。我在获取cudaErrorInvalidValue设备指针时得到了,分配了空间并从文件映射了内存。我知道错误消息(来自 API)意味着:
这表明传递给 API 调用的一个或多个参数不在可接受的值范围内。
但我正在努力弄清楚为什么我会遇到这个问题......有什么想法吗?提前致谢。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
…
int main(void)
{
struct stat buf;
…
uint32_t *data, *dev_data;
cudaDeviceProp cuda_prop;
cudaGetDeviceProperties(&cuda_prop, 0);
if (!cuda_prop.canMapHostMemory)
exit(EXIT_FAILURE);
cudaSetDeviceFlags(cudaDeviceMapHost);
int data_file = open(data_file_name, O_RDONLY);
int stat = fstat(sa_file, &buf);
int data_file_size = buf.st_size;
err = cudaHostAlloc((void**)&data, data_file_size, cudaHostAllocMapped);
if (err == cudaErrorMemoryAllocation) exit(EXIT_FAILURE);
data = (uint32_t*) mmap(0, data_file_size, PROT_READ, MAP_PRIVATE, data_file, 0);
err = cudaHostGetDevicePointer((void**)&dev_data, (void*)data, …Run Code Online (Sandbox Code Playgroud) 目前,如果我填充表单并离开页面,当我返回表单时,表单条目仍然存在。是否可以防止保存这些条目?
项目的默认值使用 PS/SQL 填充,但内容可以调整。
我尝试创建一个动态操作来清除“页面卸载”上的项目,但这没有任何作用。这是正确的浏览器事件,还是我只是把实现弄错了?
更新:提供一些上下文...
页数:
可以通过第 1 页或第 2 页访问第 3 页。
如果用户通过页面 2(一个不同的表单)访问表单,他们将选择一个特定的值,这将用于填充页面 3 上的默认值(通过项目和 PL/SQL 函数体)。
如果用户通过第 1 页访问表单,将运行相同的 PL/SQL - 这可能导致第 3 页表单项为空(NULL 默认值)。
但是,当用户编辑 Page 3 项目(从默认值更改)时,这些值将在用户下次访问表单时保持不变。如何防止这种状态被捕获?
我正在写,涉及到最小0.5GB(和最高达20GB)的分析CSV文件的程序,我从CSV读取与如下fstream,while (getline(fin,line)) {}和做17millisecs平均每个逗号分隔的记录工作.简单的东西.
但是,有很多记录.显然,该程序受I/O限制,但我想知道是否可以提高I/O性能.我无法使用OpenMP,因为我会处理CPU约束,而缓冲这个大的文件也不会工作.所以我可能需要某种管道......
我在C++中的多线程方面经验很少,从未使用过数据流框架.有人能指出我正确的方向吗?
更新(2014年12月23日):
谢谢你们的评论.你是对的,17ms有点多......在做了大量的分析(哦,痛苦)之后,我把瓶颈分离为每个记录中一个子串的迭代(75个字符).我试验过,#pragmas但它并不足以并行化.函数调用的开销是主要的抱怨 - 现在每条记录5.41μs,已经移动了一个大块.它很难看,但速度更快.
感谢@ChrisWard1000的建议.不幸的是,我对目前使用的硬件没有多少控制权,但是会使用更大的数据集(> 20GB CSV)进行分析,看看我如何引入mmap /多线程解析等.
c ×1
c++ ×1
cuda ×1
io ×1
javascript ×1
memory ×1
mmap ×1
oracle-apex ×1
performance ×1
pipeline ×1
plsql ×1