问题标签 [jcuda]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cuda - 如何为 CUDA 驱动程序 API 库实现句柄?
注意:该问题已更新以解决评论中提出的问题,并强调该问题的核心是关于 Runtime- 和 Driver API 之间的相互依赖关系
CUDA 运行时库(如 CUBLAS 或 CUFFT)通常使用“句柄”的概念来总结此类库的状态和上下文。使用模式非常简单:
但是,关于这些句柄如何与驱动程序和运行时上下文以及多个线程和设备进行互操作,有许多微妙的细节。该文档列出了有关上下文处理的几个分散的详细信息:
在http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#context的 CUDA 编程指南中对上下文的一般描述
运行时和驱动程序 API 之间的上下文管理差异,在http://docs.nvidia.com/cuda/cuda-driver-api/driver-vs-runtime-api.html中进行了解释
http://docs.nvidia.com/cuda/cublas/index.html#cublas-context的 CUBLAS 上下文/句柄的一般描述及其线程安全http://docs.nvidia.com/cuda/cublas/index .html#thread-safety2
然而,一些信息似乎并不完全是最新的(例如,我认为应该使用cuCtxSetCurrent
而不是cuCtxPushCurrent
and cuCtxPopCurrent
?),其中一些似乎来自“主要上下文”处理通过驱动程序 API 公开之前的时间,并且某些部分过于简单化,因为它们仅显示最简单的使用模式,仅对多线程进行模糊或不完整的陈述,或者不能应用于运行时库中使用的“句柄”概念。
我的目标是实现一个运行时库,它提供自己的“句柄”类型,并允许在上下文处理和线程安全方面与其他运行时库等效的使用模式。
对于库可以在内部仅使用Runtime API实现的情况,事情可能很清楚:上下文管理完全由用户负责。如果他创建自己的驱动程序上下文,则将适用文档中有关运行时和驱动程序上下文管理的规则。否则,运行时 API 函数将负责处理主要上下文。
但是,可能存在库内部必须使用Driver API的情况。例如,为了将 PTX 文件作为CUmodule
对象加载,并从中获取CUfunction
对象。当库应该(对于用户而言)表现得像运行时库,但内部必须使用驱动程序API 时,就会出现一些问题,即必须如何“在后台”实现上下文处理。
到目前为止,我所想出的都在这里勾勒出来。
(它是“伪代码”,因为它省略了错误检查和其他细节,并且......所有这些都应该在 Java 中实现,但这在这里不应该相关)
1. “句柄”基本上是一个包含以下信息的类/结构:
2.创建时,必须涵盖两种情况: 可以在调用线程的驱动程序上下文为当前时创建。在这种情况下,它应该使用这个上下文。否则,它应该使用当前(运行时)设备的主要上下文:
3.当调用库的内核时,相关句柄的上下文对于调用线程来说是当前的:
在这里,有人可能会争辩说,调用者负责确保所需的上下文是当前的。但是,如果句柄是为主要上下文创建的,那么该上下文将自动变为当前上下文。
4.当句柄被销毁时,这意味着cuDevicePrimaryCtxRelease
必须调用它,但前提是上下文是主上下文:
例如,从我迄今为止的实验来看,这似乎暴露了与 CUBLAS 句柄相同的行为。但是我彻底测试这个的可能性是有限的,因为我只有一个设备,因此无法测试关键情况,例如有两个上下文,两个设备中的每一个都有一个。
所以我的问题是:
- 是否有任何既定的模式来实现这样的“句柄”?
- 是否有任何使用模式(例如,使用多个设备和每个设备一个上下文)无法被上面概述的方法覆盖,但会被 CUBLAS 的“句柄”实现覆盖?
- 更笼统地说:是否有关于如何改进当前“处理”实施的建议?
- 修辞:CUBLAS 句柄处理的源代码在某处可用吗?
(我还查看了tensorflow 中的上下文处理,但我不确定是否可以从中得出有关如何为运行时库实现句柄的建议......)
(此处删除了“更新”,因为它是根据评论添加的,应该不再相关)
cuda - 使用驱动程序 API 创建纹理对象时 JCuda 访问冲突
我有一个 JCuda 项目,它在尝试使用驱动程序 API 创建纹理对象时遇到访问冲突。Java HotSpot 声称该错误来自 nvcuda.dll。
从中创建纹理的底层 CUarray 似乎已正确填充;将其内容复制回主机端浮点数组会生成一个与初始主机端数据相同的数组。这意味着错误本身必须是纹理声明中的某些内容,对吗?
使用 cuda-memcheck 运行代码不会显示任何错误。
这是遇到错误的代码:
我在这里做错了什么?
dllimport - 找不到指定的程序:for jcuda 9.2
我正在尝试为使用 jar.exe 工具提取的 JCudaDriver 加载 dll。
该驱动程序肯定在我的 java.libary.path 中,因为如果我手动删除它,我会得到一个未找到的类型错误。现在我收到以下错误。
线程“主”java.lang.UnsatisfiedLinkError 中的异常:myPath.JCudaDriver-0.9.2-windows-x86_64.dll.dll:找不到指定的过程
我的理解是,这个指定的过程位于对另一个 dll 的某些缺失依赖中,或者存在版本冲突。我在命令行上使用了 windows 实用程序函数dumpbin /dependents xx.dll
来查找依赖的 dll。它们如下。
我可以毫无错误地加载 nvcuda.dll,但后两个是一个问题。
这是尝试加载 ADVAPI32.dll 时的错误
线程“main”中的异常 java.lang.UnsatisfiedLinkError: C:\aaa_eric\code\lib\dlls_x64\advapi32.dll: %1 不是有效的 Win32 应用程序
java - 如果 NVIDIA 控制面板设置了计算优化,cuCtxCreate 会失败
我通过 JCuda API 运行 CUDA。当我使用 NVIDIA 控制面板为参与的 JVM 可执行文件 (java.exe) 设置计算优化(默认情况下关闭)时,程序无法在对 cuCtxCreate 的调用中创建上下文。
为了优化,程序运行得很好。唯一的问题是内核中运行时间的偏差太大(~50%)从运行到运行。我一直在寻找以垄断模式获得 CUDA 核心的方法,以获得更稳定的结果。
我是否误解了控制面板中的这个参数?
线程“主”jcuda.CudaException 中的异常:com.varankin.cuda.CudaContext 的 jcuda.driver.JCudaDriver.cuCtxCreate(JCudaDriver.java:1606) 的 jcuda.driver.JCudaDriver.checkResult(JCudaDriver.java:353) 处的 CUDA_ERROR_UNKNOWN。 (CudaContext.java:21)
配置:
- 带有集成显卡的 Intel i7-4510U,设置为默认 GPU。
- 共享内存空间上的 NVIDIA GeForce 840M。
- 视窗 10
- Java 8,修订版。152
- JCuda-All-0.9.0d-bin-x86_64
- 来自 cuda_9.2.148_win10.exe 的 CUDA
java - 尝试运行 JCuda 示例时 java.library.path 中没有 JCudaRuntime-0.9.2-windows-x86_64
我在 Gradle 中导入了以下库:
并从 JCuda 页面复制粘贴的 JCublasSampleexample 。
不幸的是,我收到以下错误:
当然,图书馆是缺席的。问题是如何链接它 Maven/Gradle?网站说所有 DLL 都应该在 JAR 中。
CUDA
已安装,但我没有在任何地方指定它的版本,就像我对nd4j
.
java - 使用 JCuda 计算肤色没有给出正确的百分比
我在 java 中计算图像的肤色。
- 在 yCbCR 中转换 Image 的像素。
- 检查图像像素是否在特定范围内,然后是肤色。
- 通过将其除以总像素来计算百分比。
它在 CPU 代码中工作正常,但是当我将其转换为 GPU 代码时,像素百分比不正确。
令我困惑的部分是将像素数据发送到 GPU 并在 GPU 中获取其 r、g、b 值。
所以我按照JCuda Pixel Invert Example示例发送像素数据。不同之处在于示例在 int[] 数组中发送像素数据,而我在 byte[] 数组中发送它。
这里是代码。
}
内核文件
java - 如何在 netbeans 中编译和运行 JCUDA?
我想在 ubuntu 16.04 的 IDE(Netbeans)中编译和运行我的 jcuda 代码。我已经安装了 Netbeans、Maven、java 和 cuda 8.0。
例如,我想运行一个向量添加示例,java 文件是JCudaVectorAdd.java并且 cuda 内核是JCudaVectorAddKernel.cu。如何使用 Netbeans 编译和运行这个简单的示例?
java - 线程“主”java.lang.NoClassDefFoundError 中的异常:jcuda/driver/JCudaDriver
我正在尝试设置 JCuda 并执行示例添加内核。当我在编译 JCudaVectorAdd.java 后尝试执行 JCudaVectorAdd 时,出现以下错误:
我创建了一个 bash 文件,其中包含为到达我所在的位置而执行的步骤:
尽管我对 java 或 cuda/jcuda 不够熟悉,无法确定我缺少什么,但似乎我在某处遗漏了一步。谁能指出如何解决此问题的方向,是否是其他步骤正在修改我执行的步骤?
编辑:看来我仍然需要在执行中引用其他 .jar 文件(就像他们在http://www.jcuda.org/tutorial/TutorialIndex.html基本测试中所做的那样),所以我的最后一个命令可能是错误的. 将其更改为以下显示的结果略有不同:
java - 是否可以从 JCuda 将数据发送到定义为 Union 的 GPU 内存?
我在 GPU 端(cuda)定义了一个像这样的新数据类型:
在 Java 中,我们有一个数组,其中一种类型在已定义的联合中可用。通常,如果我们有一个 int 类型的数组,我们可以在 Java (JCuda) 中执行以下操作:
但是如果设备上有一个数组,它的类型是我们的联合,怎么办?(假设 h_array 仍然是 int 类型)
java - 如何解决 ARM 架构上的“Maven 无法解决依赖关系”?
我的 java 项目在经典架构上正常工作,即冯诺依曼架构。但是,maven 无法解决对我的 Jetson AGX 的依赖,即 ARM 架构。在 ARM 架构上编译我的项目需要进行哪些更改?maven上有对应的包吗?
pom.xml:
出现以下错误: