小编Bre*_*ett的帖子

OpenMP num_threads(1)的执行速度比没有OpenMP的速度快

我在各种情况下运行我的代码,这导致我认为是奇怪的行为.我的测试是在带HT的双核intel xeon处理器上进行的.

没有OpenMP'#pragma'语句,总运行时间= 507秒

使用指定1核的OpenMP'#pragma'语句,总运行时间= 117秒

使用指定2核的OpenMP'#pragma'语句,总运行时间= 150秒

使用指定3核的OpenMP'#pragma'语句,总运行时间= 157秒

使用指定4核的OpenMP'#pragma'语句,总运行时间= 144秒

我想我无法弄清楚为什么注释掉我的openmp行会使程序在没有openmp的1个线程和1个带有openmp的线程之间变慢.

我正在改变的是:

//#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1) schedule(guided)

and...

#pragma omp parallel for shared(segs) private(i, j, p_hough) num_threads(1,2,3,4) schedule(guided)
Run Code Online (Sandbox Code Playgroud)

无论如何,如果有人知道为什么会这样,请告诉我!

谢谢你的帮助,

布雷特

编辑:我将在这里解决一些评论

我正在使用num_threads(1),num_threads(2)等.

经过进一步调查,结果表明,根据代码中是否包含"schedule(guided)"行,我的结果不一致.

- 当我使用计划(指导)行时,无论线程数如何,我都会生成最快的解决方案. - 当我使用默认调度程序时,我的结果明显变慢并且不同的值 - 随着线程增加而没有获得计划(指导)改进 - 没有计划(指导)我通过添加线程获得改进

我想我还没有找到一个足够好的描述(导引)对我做什么,我明白它试图分割循环,以便最先进行时间密集的迭代,这应该具有最小的影响一个线程等待其他线程完成迭代的时间.

似乎对于我的~900迭代循环,当我使用schedule(被引导)时,我只处理~200次迭代,其中没有时间表(被引导)我正在处理所有900次迭代.有什么想法吗?

c c++ multithreading openmp

10
推荐指数
1
解决办法
5567
查看次数

表上的条件Where语句值参数?

我正在构建一个包含可选参数的查询,其中一些是表值参数.我面临的问题是如何在此查询中最有效地使用TVP?

每个TVP都有这种类型:

TABLE( [variable] nvarchar(30))
Run Code Online (Sandbox Code Playgroud)

我知道我通常可以:

INNER JOIN @TVP
Run Code Online (Sandbox Code Playgroud)

过滤掉TVP列表中没有的任何内容,但如果我决定不在查询中将任何值传递给TVP,该怎么办?然后什么都不会返回(因为内连接)

通常这是通过条件where语句完成的:

WHERE (SomeVar = @SameVar OR @SameVar IS NULL)
Run Code Online (Sandbox Code Playgroud)

但是,对于TVP,它不能为空(至少不是我发现的)

我发现实现这一目标的一种方法是:

OUTER APPLY
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in 
(select * from @TVP) or not exists (select * from @TVP)
AND tbl.SomeVar = SomeVar)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法非常慢

或者,我试过:

WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP))
Run Code Online (Sandbox Code Playgroud)

这要快得多,但我仍觉得它可能不太理想

任何帮助或想法将不胜感激!让我知道我是否可以澄清任何事情......提前致谢

编辑:

所以,我已经想出了这个,并且可能会使用它,除非有人有更好的解决方案:

INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

9
推荐指数
1
解决办法
1962
查看次数

SQL CTE和ORDER BY影响结果集

我在下面粘贴了一个非常简化的SQL查询版本.我遇到的问题是该ORDER BY语句影响了我的CTE的选择结果.我无法理解为什么会这样,我最初的想法是在CTE中,我执行一些SELECT声明,然后ORDER BY应该对THOSE结果起作用.

不幸的是,我看到的行为是我的内心SELECT陈述受到了订单的影响,给了我不属于TOP 10.

以下是数据示例:(按ID以相反顺序索引)

ID,   Date
9600  2010-10-12
9599  2010-09-08
9598  2010-08-31
9597  2010-08-31
9596  2010-08-30
9595  2010-08-11
9594  2010-08-06
9593  2010-08-05
9592  2010-08-02
....
9573  2010-08-10
....
8174  2010-08-05
....
38    2029-12-20
Run Code Online (Sandbox Code Playgroud)

我的基本查询:

;with results as(
select TOP 10 ID, Date
from dbo.items
)
SELECT ID
FROM results
Run Code Online (Sandbox Code Playgroud)

查询返回:

ID,   Date
9600  2010-10-12
9599  2010-09-08
9598  2010-08-31
9597  2010-08-31
9596  2010-08-30
9595  2010-08-11
9594  2010-08-06
9593  2010-08-05 …
Run Code Online (Sandbox Code Playgroud)

sql sql-server common-table-expression sql-server-2008

7
推荐指数
2
解决办法
2万
查看次数

需要对我的SSE /大会尝试进行一些建设性的批评

我正在努力将一些代码转换为SSE,虽然我有正确的输出,但结果却比标准的c ++代码慢.

我需要做的代码是:

float ox = p2x - (px * c - py * s)*m;
float oy = p2y - (px * s - py * c)*m;
Run Code Online (Sandbox Code Playgroud)

我得到的SSE代码是:

void assemblycalc(vector4 &p, vector4 &sc, float &m, vector4 &xy)
{
    vector4 r;
    __m128 scale = _mm_set1_ps(m);

__asm
{
    mov     eax,    p       //Load into CPU reg
    mov     ebx,    sc
    movups  xmm0,   [eax]   //move vectors to SSE regs
    movups  xmm1,   [ebx]

    mulps   xmm0,   xmm1    //Multiply the Elements

    movaps  xmm2,   xmm0    //make a copy of …
Run Code Online (Sandbox Code Playgroud)

x86 assembly sse

6
推荐指数
1
解决办法
671
查看次数

为什么我的数据似乎没有对齐?

我试图弄清楚如何最好地预先计​​算一些sin和余弦值,将它们存储在对齐的块中,然后在以后用于SSE计算:

在我的程序开始时,我使用成员创建一个对象:

static __m128 *m_sincos;
Run Code Online (Sandbox Code Playgroud)

然后我在构造函数中初始化该成员:

m_sincos = (__m128*) _aligned_malloc(Bins*sizeof(__m128), 16);
for (int t=0; t<Bins; t++)
  m_sincos[t] = _mm_set_ps(cos(t), sin(t), sin(t), cos(t));
Run Code Online (Sandbox Code Playgroud)



当我使用m_sincos时,我遇到了三个问题:
- 数据似乎没有对齐

movaps xmm0, m_sincos[t] //crashes
movups xmm0, m_sincos[t] //does not crash
Run Code Online (Sandbox Code Playgroud)

- 变量似乎不正确

movaps result, xmm0 // returns values that are not what is in m_sincos[t]
//Although, putting a watch on m_sincos[t] displays the correct values
Run Code Online (Sandbox Code Playgroud)

- 让我感到困惑的是,这会使一切正常(但速度太慢):

__m128 _sincos = m_sincos[t];
movaps xmm0, _sincos
movaps result, xmm0
Run Code Online (Sandbox Code Playgroud)

c++ alignment intrinsics

4
推荐指数
1
解决办法
755
查看次数

使用ScriptManager/ToolkitManager从Microsoft的CDN加载AjaxControlToolkit脚本

我知道还有另外一个问题要求同样的事情,但它现在几个月没有得到任何关注:https://stackoverflow.com/questions/3786088/how-to-force-ajax-control-toolkit-scripts-loading -从-CDN

我已将我的网站升级到.NET4,现在我正在使用scriptManager的EnableCDN ="true"标记.我的Ajax脚本正在从Microsoft CDN中引用我的预期,但我似乎无法从CDN加载我的AjaxControlToolkit脚本.相反,它们都通过ScriptResource.axd在本地加载.

我知道CDN文件的位置,我知道每次使用控件时我都可以引用这些文件,但是我有很多遗留代码可以从scriptmanager中自行加载,只需要拉出ScriptResource.axd文件.

有关如何从CDN加载控件工具包脚本的任何建议吗?我已经有了标准的WebForms.js等.

让我知道如果有什么我可以清理,这是我正在使用的脚本管理器:(我已经尝试过toolkitscriptmanager)

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" 
EnableCdn="true" EnableScriptLocalization="false" 
LoadScriptsBeforeUI="false" EnableViewState="false" />
Run Code Online (Sandbox Code Playgroud)

asp.net ajax cdn .net-4.0 ajaxcontroltoolkit

4
推荐指数
1
解决办法
4690
查看次数

回到指针的开头?

我知道你可以拿指针,如:

someFunction(const char* &txt)
{
    txt++; //Increment the pointer
    txt--; //Decrement the pointer
}
Run Code Online (Sandbox Code Playgroud)

我如何回到指针的开头?(不计算我的增量数量并减少该数量)我在想类似的事情:

txt = &(*txt[0]);
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用(将指针指定到其起始位置).

任何帮助将不胜感激

布雷特

c++ pointers

3
推荐指数
1
解决办法
3976
查看次数

构建和使用通用列表?

任何人都可以帮我弄清楚如何简化这段代码,而不使用ArrayList

List<Pair> material = new List<Pair>();
List<string> list = new List<string>();

string tempStr;
int integer = -1;
foreach (string s in ((string)Value).Split(new char[1] { ',' }))
{
  if (int.TryParse(s, out integer))
  {
     tempStr = NameValue.AllKeys[integer];

     if (someCondition == true)
     {
        material.Add(new Pair(tempStr, integer));
     }
     else
     {
        list.Add(tempStr);
     }
  }
}
if(someCondition == true)
{
  return material.ExtensionMethodForLists();
}
else
{
  return list.ExtensionMethodForLists();
}
Run Code Online (Sandbox Code Playgroud)

当我尝试过类似下面的内容时,我会因为没有初始化一个有意义的类型变量而出错.

var list;
if(someCondition == true)
{
  list = new List<Pair>();
}
else
{
  list = …
Run Code Online (Sandbox Code Playgroud)

c# generics generic-list .net-4.0

2
推荐指数
1
解决办法
560
查看次数