我在各种情况下运行我的代码,这导致我认为是奇怪的行为.我的测试是在带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次迭代.有什么想法吗?
我正在构建一个包含可选参数的查询,其中一些是表值参数.我面临的问题是如何在此查询中最有效地使用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查询版本.我遇到的问题是该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) 我正在努力将一些代码转换为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) 我试图弄清楚如何最好地预先计算一些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) 我知道还有另外一个问题要求同样的事情,但它现在几个月没有得到任何关注: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) 我知道你可以拿指针,如:
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)
但这似乎不起作用(将指针指定到其起始位置).
任何帮助将不胜感激
布雷特
任何人都可以帮我弄清楚如何简化这段代码,而不使用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)