Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在OpenCL中保存数据_C#_Opencl - Fatal编程技术网

C# 在OpenCL中保存数据

C# 在OpenCL中保存数据,c#,opencl,C#,Opencl,我需要在OpenCL中长时间处理一些数据,由于时间限制(驱动程序自动重启),我使用不同的参数多次启动内核。每次它都必须处理相同的数据,大约50MB,所以我只想复制一次。我读过很多关于OpenCL的文章和教程,但不知道如何在执行之间保存数据 如果这很重要,我会为OpenCL使用C#绑定,称为OpenCLTemplate。正如我从在线阅读中了解到的,只有一个内核可以同时运行。这意味着您应该能够使用一组参数启动它,当完成一组新的参数时可以启动,然后在运行时可以读取50mb 如果驱动程序重新启动-这可能

我需要在OpenCL中长时间处理一些数据,由于时间限制(驱动程序自动重启),我使用不同的参数多次启动内核。每次它都必须处理相同的数据,大约50MB,所以我只想复制一次。我读过很多关于OpenCL的文章和教程,但不知道如何在执行之间保存数据


如果这很重要,我会为OpenCL使用C#绑定,称为OpenCLTemplate。

正如我从在线阅读中了解到的,只有一个内核可以同时运行。这意味着您应该能够使用一组参数启动它,当完成一组新的参数时可以启动,然后在运行时可以读取50mb


如果驱动程序重新启动-这可能是由于错误/异常

为什么不能为所有内核执行保留一个只读缓冲区,并将结果放在不同的缓冲区中


是什么让你认为你必须写入你正在读取的同一个缓冲区?

存储在全局内存缓冲区中的任何数据都将保留在GPU上。你不需要做任何特别的事情。

你有几个问题

1) 如何在GPU上获得50MB的数据 2) 在windows上,当您运行长时间计算时,GPU驱动程序将频繁重置 3) 一种~50MB的持久化机制

可能的答案 1a)创建50M的OpenCL内存缓冲区 1b)将数据排队(写入)到GPU 1c)将内核参数设置为此缓冲区 1d)作为GPU全局内存中的内核参数访问数据

2) 当OpenCL驱动程序(图形)重置时,应用程序将死亡。 您可以编写脚本,在系统执行之前终止它,然后重新启动应用程序。脚本应该在终止应用程序之前读回一个中间结果。 否则你将永远无法控制局面。仅使用Nvida特斯拉GPU运行 在Windows上或在Linux上运行将避免O/S思维显示不起作用并重置驱动程序

3) 我将使用MMAPed文件来保存50MB的数据和任何中间结果。这个 MMAPed文件地址可用于为应用程序创建OpenCL缓冲区


最后,我将质疑这种方法。在Windows和Linux上运行,由于驱动程序重置问题等原因。即使使用PostgreSQL数据库和我自己的PgOpenCL,我也无法找到解决Windows上驱动程序超时问题的有效解决方案,PgOpenCL保证所有GPU内核的执行都是酸性的。

驱动程序由于时间限制而重新启动:如果内核运行很长时间,Windows会关闭它。同时运行的内核与此无关;实际上,您可以在某些GPU上同时运行不同的内核;您所建议的数据传输与问题相反。现在,我以所有数据作为参数启动内核函数,并将结果作为另一个参数,函数将结果数据写入该参数。我不知道如何在我的内核执行之间对数据进行统计,缓冲区在这种情况下能帮我吗?关于它,你有什么建议,特别是通过例子?你会问,“什么是openCL?”缓冲区的创建和管理很容易超过openCL战斗的50%。了解主机和设备之间通信的基本数据结构是使用该技术的先决条件。PyOpenCL是我用来学习OpenCL的。~50MB总是只读的吗?看起来您运行的Windows O/S将每隔几分钟重置OpenCL驱动程序,您将丢失GPU上的任何数据。内核只能同时运行约0.5秒(例如,我没有测量确切的时间限制),这不是我的问题。我需要一种在内核执行之间持久化数据(只读)的方法。现在我明白了需要一个
全局缓冲区
,并开始尝试将其与C#或python绑定一起创建和使用(“因为我真的不喜欢C,也不喜欢用这种语言编写整个程序”)。