问题标签 [jocl]

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.

0 投票
2 回答
731 浏览

java - Mac 上的 JOCL 帮助

我正在尝试在我的 Mac 上运行本教程。

本教程适用于 windows,包含 jocl 版本 1.3 (JOCL-0.1.3a-beta.jar) 和 windows 的原生 jocl dll (JOCL-windows-x86_64.dll)。

获取代码后,我基本上摆脱了 jocl 1.3 jar 和 dll 并用最新的 jocl 1.4 jar替换它,它应该为 mac 和 windows 打包资源。

这样做之后,当我运行教程时,我收到以下错误:

看起来jar 的资源中缺少libJOCL-apple-x86_64.dynlib动态库。

我不是 Java 专家,也不知道下一步该尝试什么。

任何帮助表示赞赏!

0 投票
2 回答
870 浏览

cuda - 使用 JOCL 确定 GPU 上可用的全局内存?

我正在编写在 GPU 上运行的 JOCl.org(与 jogamps jocl 不同)。正在处理足够的数据,我需要小心保持在 GPU 的全局内存限制之下。为此,我需要一种以编程方式确定 GPU 有多少内存的方法。我认为必须有一个简单的 JOCL 方法/变量来执行此操作,但由于某种原因,我似乎无法弄清楚它是什么。我查看了 CL.CL_MEM_SIZE 和 CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 但它们都返回 4100 左右;我知道我目前正在使用假定包含 512 MB 的显卡。

此外,我似乎无法使用尽可能多的内存。在最坏的情况下,我必须运行一个内核来处理 2^22 个浮点数的帧,并且在内部需要两倍于帧大小的数据。如果我尝试缓存两帧(所以 2 帧 * 2^22 * 2^2 字节/浮点数 * 2 开销 = 2^26)我可以毫无困难地缓存,但是当我增加缓存时,我一次处理三个帧时间(或 2^25*3)我似乎内存不足。但是,我相信我应该只使用 512 MB 全局内存中的 ~100 个。我相信我在不使用时会正确释放内存,但显然我要么做错了什么,要么误解了 GPU 宣传的 512 MB。谁能帮我解释一下这种困惑?

有没有办法可以分析 GPU 以了解实际内存使用情况?

0 投票
1 回答
104 浏览

optimization - JNCI/JCOL 内核优化

我有一个在开放 CL 中运行的内核(通过 jocl 前端),与其他内核相比,它的运行速度非常慢,我试图弄清楚为什么以及如何加速它。这个内核非常基础。它的唯一工作是抽取我们拥有的样本点的数量。它将输入数组中的每个第 N 个点复制到一个较小的输出数组以缩小我们的数组大小。

内核被传递一个浮点数,指定在“好”点之间跳过多少点。因此,如果超过 1.5 分,它将跳过 1 分,10 分 2 分,然后 1 分等,以保持平均每 1.5 分被跳过。输入数组已经在 GPU 上(它是由较早的内核生成的),而输出数组将保留在内核上,因此无需向 CPU 传输数据或从 CPU 传输数据。

这个内核的运行速度比其他任何内核慢 3-5 倍;并且比一些快速内核慢 20 倍。我意识到我因为没有合并我的数组访问而受到惩罚;但我不敢相信它会导致我跑得这么慢。在所有其他内核都接触阵列中的每个样本之后,我认为接触阵列中的每个 X 样本,即使没有合并,至少应该与接触阵列中的每个样本的速度大致相同。

原始内核实际上一次抽取了两个数组,用于实数和虚数数据。我尝试将内核拆分为两个内核调用,一个用于抽取实数,一个用于抽取虚数据;但这根本没有帮助。同样,我尝试通过让一个线程负责抽取 3-4 个点来“展开”内核;但这没有任何帮助。我尝试弄乱传递给每个内核调用的数据大小(即一个内核调用数千个数据点,或者几个内核调用少量数据点),这使我能够调整小的性能提升;但没有达到我认为值得在 GPU 上实现该内核所需的数量级。

只是为了给人一种规模感,这个内核每次迭代运行需要 98 毫秒,而对于相同的输入数组大小,FFT 只需要 32 毫秒,而其他每个内核都需要 5 毫秒或更短的时间。与其他正在运行的内核相比,还有什么可能导致如此简单的内核运行得如此缓慢?是否有可能我实际上无法充分优化此内核以保证在 GPU 上运行它。我不需要这个内核比 CPU 运行得更快;与 CPU 相比没有那么慢,所以我可以将所有处理都保留在 GPU 上。

0 投票
1 回答
395 浏览

opencl - 通过 JOCL 进行 GPU 编程仅使用 80 个着色器内核中的 6 个?

我试图让一个程序在我的 GPU 上运行并从一个简单的示例开始我修改了http://www.jocl.org/samples/samples.html上的第一个示例并运行以下小脚本:我运行 n同时的“线程”(GPU 等效线程的正确名称是什么?),每个线程执行 20000000/n 次独立的 tanh() 计算。你可以在这里看到我的代码:http: //pastebin.com/DY2pdJzL

速度远远不是我预期的:

  • n=1 需要 12.2 秒
  • n=2 需要 6.3 秒
  • n=3 需要 4.4 秒
  • 对于 n=4 需要 3.4 秒
  • n=5 需要 3.1 秒
  • 对于 n=6 及以上,需要 2.7 秒。

所以在 n=6 之后(无论是 n=8、n=20、n=100、n=1000 还是 n=100000),性能都没有提高,这意味着其中只有 6 个是并行计算的。但是,根据我的卡的规格应该有 80 个核心:http ://www.amd.com/us/products/desktop/graphics/ati-radeon-hd-5000/hd-5450-overview/pages/hd -5450-overview.aspx#2

这不是开销问题,因为增加或减少 20000000 仅在所有执行时间中影响线性因素。

我已经安装了支持 OpenCL 的 AMD APP SDK 和驱动程序:请参阅http://dl.dropbox.com/u/3060536/prtscr.pnghttp://dl.dropbox.com/u/3060536/prtsrc2.png了解详细信息(或者至少我从这些中得出结论,OpenCL 运行正常)。

所以我现在有点无能为力,在哪里寻找答案。为什么 JOCL 只能在我的 ATI Radeon HD 5450 上执行 6 次并行执行?

0 投票
2 回答
1455 浏览

memory - OpenCL:如何在 JOCL 中使用本地内存

假设我想对一个大型固定对象执行并行计算,例如一个固定的大型稀疏(有向)图,或任何类似类型的对象。

要对此图或对象进行任何合理的计算,例如图中的随机游走,出于速度原因,将图放在全局内存中可能是不可能的。

这留下了本地/私人内存。如果我对 GPU 架构的理解正确,那么(只读)访问本地或私有内存之间几乎没有速度差异,对吗?我不愿意将图形复制到私有内存,因为这意味着每个工作单元都必须存储整个图形,这可能会很快耗尽 GPU 的内存(对于非常大的图形,甚至会减少可以使用和/或使操作系统不稳定)。

所以,假设我在本地与私有的读取速度上是正确的,我该如何在实践中做到这一点?如果例如为了简化我将图简化为 anint[] from和 an int[] to(存储每个有向边的开始和结束),我当然可以使内核看起来像这样

但我不知道我应该如何从 JOCL 调用它,因为那里没有给出私有/本地/全局修饰符。

局部变量会自动写入每个本地工作组的内存吗?或者这是如何工作的?我完全不清楚我应该如何正确地进行内存分配。

0 投票
1 回答
213 浏览

java - 无法运行从 jocl.org 下载的 JOCL 示例。(Java 的 OPENCL)

我已经从jocl.org下载了示例文件并编译它没有问题(c:\javac -cp c:\jocl.jar JOCLSample.java

当我尝试运行它(c:\java -cp c:\jocl.jar JOCLSample)时,发生了一些错误:

我该如何纠正?

0 投票
1 回答
298 浏览

java - 使用 gpgpu 进行大量矢量计算的最佳方法?

我有一个 100 万列 x 100 万行的矩阵。

我的算法需要做:

或者你也可以说:

我的问题:为这个问题分配内存和初始化内存的正确方法是什么:

- 我应该为完整矩阵分配内存,用完整矩阵初始化它,然后运行算法吗?
- 或者我应该为向量列表分配内存,然后遍历这个列表?
- 要不然??

我担心的是我想尽量减少到 gpu 的传输时间。我已经通过修改JCublas hello world 示例来尝试这种计算,以对 2 个向量进行 sgemm 操作,但是在我的大量向量上执行此操作时,最终导致传输时间删除了 gpu 加速的好处。

谢谢!PS:实现可以在任何Java库中

0 投票
1 回答
526 浏览

java - Java:将多维数组转换或引用为一维数组

我有一个用 Java 编写的程序,其中涉及大量的多维数组。我正在尝试使用 JOCL (OpenCL) 对其进行并行化,但是在传递给 OpenCL 之前,必须将多维数组转换为一维数组。

除了用一维数组重写整个程序,还有其他的解决办法吗?

0 投票
1 回答
312 浏览

java - Java OpenCL:在 JOCL 中将标量参数传递给内核

有没有一种方法可以在 JOCL 中将标量参数传递给内核而不创建新数组?在 C++ 中,可以简单地将标量参数(例如 int)转换为 void*

0 投票
2 回答
453 浏览

java - 带有 JOCL 的 Java OpenCL:什么是直接缓冲区?

当我在 clEnqueueReadBuffer 上进行试验时,我遇到了一个异常:

线程“main”中的异常 java.lang.IllegalArgumentException:只能使用指向直接缓冲区的指针执行非阻塞读取操作

在这条线上:

其中 zCacheMem 是 cl_mem,zCachePtr 指向一个 int[]

我找不到任何解释此错误的文档。有人可以帮忙吗?