- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在具有8个逻辑CPU内核的64位Windows 8.1 PC上,在Julia v0.3.7的REPL中执行此命令时:
blas_set_num_threads(CPU_CORES)
const v=ones(Float64,100000)
@time for k=1:1000000;s=dot(v,v);end
blas_set_num_threads(CPU_CORES)
@time peakflops(10000)
dot()
和
peakflops()
都使用BLAS(在我的情况下为OpenBLAS),因此我希望它们都使用
blas_set_num_threads()
指定的线程数。但是,仅后者功能实际上起作用。
dot()
的行为是否是由于错误(可能是OpenBLAS中的错误)引起的?
dot()
操作进行迭代,其中子向量使用连续的内存。矩阵乘法迫使我转置每个向量,从而创建了一个副本。在内循环中这是昂贵的。因此,对我来说,选择似乎是学习如何使用Julia的并行处理命令/宏,还是回到Python(英特尔的MKL BLAS如
ddot()
所预期的那样运行)。由于
dot()
是在我尝试编写的例程中消耗99%CPU的函数,因此我希望OpenBLAS在Julia中为我提供用户友好的最佳解决方案,而不必担心引擎盖下所有并行处理的复杂性。但是也许还不错...
dot()
函数。一些示例代码将是最好的帮助。当所有线程都在同一台计算机上运行时,我需要使用SharedArray吗?如果是这样,从Array转换为SharedArray是否会创建一个副本?由于我的数组很大,因此我不想同时在内存中复制两个副本。因为我的向量长度约为100,000,并且来自一个数组的向量以不可预测的顺序使用,所以对我而言,最好的多线程解决方案是dot()函数,该函数将任务拆分为可用的核心,并对结果求和每个核心。如何在Julia中像BLAS一样有效地做到这一点?
dot()
函数,并且无法回答我的其他问题。
dot()
替换为
innersimd()
:
innersimd()
,将其参数键入为
::Array{Float64, 1}
,然后键入
::SharedArray{Float64, 1}
,但这仍然使用1个核心。 :(
blas_set_num_threads(CPU_CORES)
const A=ones(Float64,(4,100000))
const B=ones(Float64,(100000,4))
@time for k=1:100000;s=A*B;end
import numpy as np
from scipy.linalg.blas import ddot
from timeit import default_timer as timer
v = np.ones(100000)
start = timer()
for k in range(1000000):
s = ddot(v,v)
exec_time=(timer() - start)
print
print("Execution took", str(round(exec_time, 3)), "seconds")
ddot()
的单线程实现来解释。
ddot()
(并对结果求和)?该长度可能不完全是4的倍数。由于OpenBLAS是单线程的,因此我可以在命令行中使用“-p 8”命令行参数运行Julia,并在同一 session 中对其他自定义函数进行多线程处理。
blas_set_num_threads(CPU_CORES)
const a = rand(10000, 10000)
@time a * a
最佳答案
原因是OpenBLAS的ddot
似乎不是多线程的。我认为它们主要为BLAS-3函数(例如xgemm
)实现多线程,因此,如果可能的话,最好的办法是使用矩阵乘法编写问题。
如果您可以举一个如何尝试矩阵乘法的例子,那将会有所帮助。也许可以避免换位。您是如何在Python中做到这一点的?一切都只是BLAS,所以Julia在这里应该能和Python一样好。
使用-p 8
标志运行Julia会启动Julia的九个副本,并关闭BLAS中的多线程,因此这可能会使您的情况更糟。
编辑1:
我在单线程和多线程模式下使用OpenBLAS和MKL尝试了您的示例,如果有任何区别,单线程会更快。我不确定OpenBLAS是否为您的示例使用了多个线程。对于细小的问题,可能很难实现多线程加速,因此,对于较严重的问题,它们只能打开多线程。如果您的示例在同一台计算机上运行时,使用Python的速度明显更快?如果是这样,请提供Python示例,以便可以与我的计算机上的示例进行比较。
编辑2:
我可以确认MKL中ddot
的加速。确切地说,Edit 1中的注释是关于dgemm
的。正在使Julia成为多线程的积极工作,当这种情况发生时,Julia的线程实现可能比OpenBLAS的ddot
更快。您现在的选择是以下之一
dgemm
使用多个线程,即使用较胖的矩阵。在我的机器上,n=16
似乎加入了多线程。如果可能的话,我认为这不会比MKL慢。通常,OpenBLAS的dgemm
与MKL的比较好。 ddot
多线程。如果您可以仅向项目提供一个版本,那会更好,但是高性能的BLAS代码很难编写。 ddot
实现线程。
关于multithreading - 如何获得多线程dot()函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29398202/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!