Lua 如何在Torch nn包中禁用omp?

Lua 如何在Torch nn包中禁用omp?,lua,openmp,torch,Lua,Openmp,Torch,具体来说,我希望nn.LogSoftMax在输入张量较小时不使用omp。我有一个小脚本来测试运行时 需要“nn” my_lsm=函数(t) o=火炬零点(#t)[1]) 总和=0.0 对于i=1,(#t)[1]do o[i]=torch.exp(t[i]) sum=sum+o[i] 终止 o=o/和 返回火炬日志(o) 终止 ii=火炬的随机数(arg[1]) m=nn.LogSoftMax() timer=torch.timer() 计时器:停止() 计时器:重置() 计时器:resume()

具体来说,我希望
nn.LogSoftMax
在输入张量较小时不使用omp。我有一个小脚本来测试运行时

需要“nn”
my_lsm=函数(t)
o=火炬零点(#t)[1])
总和=0.0
对于i=1,(#t)[1]do
o[i]=torch.exp(t[i])
sum=sum+o[i]
终止
o=o/和
返回火炬日志(o)
终止
ii=火炬的随机数(arg[1])
m=nn.LogSoftMax()
timer=torch.timer()
计时器:停止()
计时器:重置()
计时器:resume()
my_lsm(二)
打印(计时器:time().real)
计时器:停止()
计时器:重置()
计时器:resume()
m:前进(二)
打印(计时器:time().real)
如果
arg[1]
为10,则我的基本日志softmax函数运行得更快:

0.00021696090698242
0.033425092697144
但一旦
arg[1]
达到10000000,omp真的能帮上大忙:

29.561321973801 
0.11547803878784
所以我怀疑omp开销非常高。如果我的代码必须使用较小的输入多次调用log softmax(表示张量大小仅为3),则会花费太多时间。是否有办法在某些情况下(但并非总是)手动禁用omp使用

是否有办法在某些情况下(但并非总是)手动禁用omp使用

如果你真的想这样做,一种可能是使用这样的方法:

local nth = torch.getnumthreads()
torch.setnumthreads(1)
-- do something
torch.setnumthreads(nth)
因此,您可以按如下方式使用monkey patch
nn.LogSoftMax

nn.LogSoftMax.updateOutput = function(self, input)
  local nth = torch.getnumthreads()
  torch.setnumthreads(1)
  local out = input.nn.LogSoftMax_updateOutput(self, input)
  torch.setnumthreads(nth)
  return out
end
是否有办法在某些情况下(但并非总是)手动禁用omp使用

如果你真的想这样做,一种可能是使用这样的方法:

local nth = torch.getnumthreads()
torch.setnumthreads(1)
-- do something
torch.setnumthreads(nth)
因此,您可以按如下方式使用monkey patch
nn.LogSoftMax

nn.LogSoftMax.updateOutput = function(self, input)
  local nth = torch.getnumthreads()
  torch.setnumthreads(1)
  local out = input.nn.LogSoftMax_updateOutput(self, input)
  torch.setnumthreads(nth)
  return out
end

你是如何测量时间的?您似乎在测量单个调用,在这种情况下,您将包括大量OpenMP启动成本,因为它在第一次并行时创建线程。如果您的实际代码执行多个这样的操作,其性能将有所不同。(这并不是说你错了;在小作业中不使用并行性可能会更好,但这是说这种测量方法可能会误导人)。@JimCownie,我明白你的观点,运行时间可能会误导人。但是,我无法控制何时创建和销毁线程。因此,我使用softmax函数上的附加for循环测试了我的代码。OpenMP版本在小输入情况下仍然需要更长的时间。您如何测量时间?您似乎在测量单个调用,在这种情况下,您将包括大量OpenMP启动成本,因为它在第一次并行时创建线程。如果您的实际代码执行多个这样的操作,其性能将有所不同。(这并不是说你错了;在小作业中不使用并行性可能会更好,但这是说这种测量方法可能会误导人)。@JimCownie,我明白你的观点,运行时间可能会误导人。但是,我无法控制何时创建和销毁线程。因此,我使用softmax函数上的附加for循环测试了我的代码。OpenMP版本在小输入情况下仍然需要更长的时间。