我的系统有显卡.我不玩游戏.
我想编写一些高性能计算的东西以获得乐趣.
我可以使用JULIA lang来利用我的硬件吗?
我有一些代码可以计算一个矩阵中每个笛卡尔坐标与另一个矩阵中其他坐标之间的距离。对于每个坐标,将返回最小距离以及产生最小坐标的索引位置。
function MED3D(m1, m2)
n1::Int = size(m1,1)
Dist = SharedArray{Float64}((n1,3))
@sync @distributed for k in 1:n1
Dist[k,:] = MD3D(m1[k,:], m2, k)
end
return Dist
end
@everywhere function MD3D(v1, m2, k)
dsum::Float64 = Inf
dtemp::Float64 = Inf
i = 0
for j in 1:size(m2,1)
@inbounds dtemp = sqrt((v1[1] - m2[j,1]) * (v1[1] - m2[j,1]) + (v1[2] - m2[j,2]) * (v1[2] - m2[j,2]) + (v1[3] - m2[j,3]) * (v1[3] - m2[j,3]))
if dtemp < dsum
dsum = dtemp
i = j
end …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Julia的CUDArt包来管理GPU计算.我想知道如何确保如果我从gpu(例如使用to_host()
)中提取数据,而在执行所有必要的计算之前我不这样做.
通过一些实验,似乎to_host(CudaArray)
在特定的CudaArray更新时会滞后.那么,或许只是使用它就足以确保安全?但它看起来有点渺茫.
现在,我正在使用该launch()
函数来运行我的内核,如包文档中所述.
CUDArt文档给出了一个使用Julia的@sync
宏的例子,看起来它可能很可爱.但是出于@sync
我的目的,我完成了我的"工作"并准备好在内核启动后立即继续launch()
,而不是一旦完成.据我了解的操作launch()
- 没有办法改变这个功能(例如,让它等待接收函数的输出"启动").
我怎样才能实现这种同步?
我目前正在使用CUDArt包.在加载包含自定义CUDA C内核的ptx模块时,GitHub 文档包含以下代码片段:
md = CuModule("mycudamodule.ptx", false) # false means it will not be automatically finalized
Run Code Online (Sandbox Code Playgroud)
(原评论)
我试图了解这个false
选项究竟是什么意思,以及何时我想/不想使用它.我在SO上发现了这篇文章(在Julia中编写模块finalize方法的正确方法是什么?).它引自Julia文档:
终结者(x,函数)
当没有程序可访问的x引用时,注册要调用的函数f(x).如果x是位类型,则此函数的行为是不可预测的.
我真的不明白这意味着什么,或者甚至这里的最终确定是否与CUDArt示例中提到的相同.例如,x
当程序无法访问该参数时,尝试在参数上调用函数是没有意义的 - 这怎么可能呢?因此,我要感谢任何澄清的帮助:
我有n
单独的GPU,每个都存储自己的数据.我想让他们每个人同时进行一组计算.这里的CUDArt文档描述了使用流来异步调用自定义C内核以实现并行化(另请参见此处的其他示例).使用自定义内核,可以通过stream
在CUDArt的launch()
函数实现中使用参数来实现.但据我所知,CUSPARSE(或CUBLAS)函数没有类似的流规范选项.
这可能与CUSPARSE一起使用,或者如果我想使用多个GPU,我是否只需要深入到C?
修订后的赏金更新
好的,所以,我现在有一个相对不错的解决方案,最后.但是,我确信它可以通过百万种方式得到改善 - 现在它非常黑客.特别是,我喜欢根据我在这个 SO问题中尝试和写过的解决方案的建议(我从来没有正常工作).因此,我很高兴将赏金奖励给任何有进一步想法的人.
我一直在尝试绘制一个简单的函数:
v(x, y) = (y*t, 2*x*t)
Run Code Online (Sandbox Code Playgroud)
(实际执行:v(x::Point2{T}, t) where T = Point2{T}(one(T) * x[2] * t, 4 * x[1])
)
使用Makie的2D流图功能。
虽然我可以分别绘制每个时间步长,但是通过创建一个匿名函数f = x -> v(x, 5e0)
(例如)并绘制f
,当我尝试将其包装到Observable中(使用Node(f)
)时,我再也无法更新该Observable指向另一个函数,因此我的记录循环失败。
我尝试将Node的类型强制为更抽象(Node{Function}
)。不幸的是,这种抽象类型似乎丢失在Makie内部的某个地方,因此丢失了。
有什么办法可以包装我的类型,以免遇到类型冲突,但仍然是Function?
我正在考虑购买GPU卡来试验朱莉娅的GPU计算.我现在看到它基本上有两种选择:NVIDIA或AMD芯片组.
我的问题是:是否有与Julia一起使用的推荐选项?由于我是GPU计算的新手,我更关注的是易用性而不是性能,所以我可以想象当前用作GPU接口的Julia软件包基本上决定了答案.
我使用基于Windows 7的系统.任何帮助表示赞赏.