一般来说,我在网上看到的与SSE/MMX相关的一切都是向量和数据的数学东西.但是,我正在寻找SSE优化的"标准函数"库,如Agner Fog提供的库,或GCC中的一些基于SSE的字符串扫描算法.
作为一个简单的概述:这些将是像memset,memcpy,strstr,memcmp BSR/BSF,即从SSE intrsuctions构建的stdlib-esque
我最好喜欢它们用于SSE1(正式MMX2)使用内在函数而不是汇编,但两者都很好.希望这不是一个广泛的范围.
更新1
经过一番搜索,我发现了一些有前途的东西,一个图书馆引起了我的注意
我还看到一篇关于一些矢量化字符串函数的文章(strlen,strstr strcmp).然而SSE4.2是这样我够不着的地方(如前面所说的,我想坚持到SSE1/MMX).
更新2
Paul R激励我做一些基准测试,遗憾的是,由于我的SSE汇编编码经验接近于zip,我使用了别人的(http://www.mindcontrol.org/~hplus/)基准测试代码并添加到其中.所有测试(不包括原始版本,即VC6 SP5),在VC9 SP1下编译,具有完整/自定义优化/arch:SSE功能.
第一次测试是我的家用机器(AMD Sempron 2200+ 512mb DDR 333),上限为SSE1(因此没有MSVC memcpy的矢量化):
comparing P-III SIMD copytest (blocksize 4096) to memcpy
calculated CPU speed: 1494.0 MHz
size SSE Cycles thru-sse memcpy Cycles thru-memcpy asm Cycles thru-asm
1 kB 2879 506.75 MB/s 4132 353.08 MB/s 2655 549.51 MB/s
2 kB 4877 598.29 MB/s 7041 414.41 MB/s …Run Code Online (Sandbox Code Playgroud) 我有这个简单的程序:
DateTime aux = new DateTime(2012, 6, 12, 12, 24, 0);
DateTime aux2 = new DateTime(2012, 6, 12, 13, 24, 0);
aux2.AddDays(1);
Console.WriteLine((aux2 - aux).TotalHours.ToString());
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
我调试了这个,发现aux2.AddDays(1);似乎不起作用,我在这里缺少什么?它应该返回25但答案是一个.
问题是什么?
也AddHours行不通,我猜其他人也不行.
删除的C代码,看到这是造成一些混乱(它不应该已经在那里开始.遗憾的任何不便,有Ç回答,因为仍然欢迎虽然:)
在几件事情我已经做了,我已经找到了需要创建具有动态大小和静态的大小,其中,静态部件是你的基本对象的成员,但动态部分是一个数组对象/缓冲直接追加到类,保持存储器中连续,因此减少需要分配的量(这些是不可重分配对象),并降低分片(虽然为下侧,它可能是更难找到一个足够大的尺寸的块,但是这很多较为少见 - 如果它甚至应该出现在所有 - 比堆破碎,这也是在嵌入式设备上有用,其中的内存是非常宝贵的(但我不这样做对目前嵌入式设备的任何东西),事情就是这样STD: :字符串需要避免,或者不能像琐碎的联合一样使用.
通常我会这样做的方式是(ab)使用malloc(std :: string不是故意使用的,并且由于各种原因):
struct TextCache
{
uint_32 fFlags;
uint_16 nXpos;
uint_16 nYpos;
TextCache* pNext;
char pBuffer[0];
};
TextCache* pCache = (TextCache*)malloc(sizeof(TextCache) + (sizeof(char) * nLength));
Run Code Online (Sandbox Code Playgroud)
然而,这并不适合我,因为首先我想使用new,因此在C++环境中这样做,其次,它看起来很可怕:P
所以下一步是模板化的C++变量:
template <const size_t nSize> struct TextCache
{
uint_32 fFlags;
uint_16 nXpos;
uint_16 nYpos;
TextCache<nSize>* pNext;
char pBuffer[nSize];
};
Run Code Online (Sandbox Code Playgroud)
然而,这存在将存储指向可变大小对象的指针变为"不可能"的问题,因此接下来的解决方法是:
class DynamicObject {};
template <const size_t nSize> struct TextCache : DynamicObject {...};
Run Code Online (Sandbox Code Playgroud)
然而,这仍然需要铸造,具有指针DynamicObject遍的时候更是一个动态大小的物体提炼出来的(这也看起来可怕,可从强制空类仍然有大小错误受苦的地方变得模糊,虽然这可能是一个古老的,灭绝的虫子......).
然后是这样的:
class DynamicObject
{
void* operator new(size_t nSize, size_t nLength)
{
return malloc(nSize + …Run Code Online (Sandbox Code Playgroud) 是否有可能向QPushButton添加工具提示.我的意思是,当你滚动按钮时会出现一个小文本框(通常是黄色)并告诉用户这个按钮在做什么.
谢谢.
背景(如果你想要问题,请跳到底部)
最近我将SVN存储库(在assembla上托管)升级到SVN 1.7.执行此操作后,我们开始间歇性地File Access Denied在位于存储库的本地工作副本的ASP.NET网站页面上遇到大量错误.
一些文件夹也开始获得奇怪的文件权限(它们变为标记为只读)并且用户共享已从它们中删除.这些问题只会在更新/提交周期后通过AnkhSVN的Visual Studio插件开始,但不是所有的时间; 它看起来很有气质.
到目前为止,我们发现的唯一临时修复是提交任何未完成的更改,删除本地副本并重新签出完整的工作副本(使用TortoiseSVN).但是,这不是一个可行的解决方案,它严重影响了生产力.
此站点是基于Azure的ASP.NET WebWorkerRole.它在升级到SVN 1.7之前从未出现过问题.我试图摆弄内部IIS权限来解决问题,但是,没有骰子.
我的环境
问题
SVN 1.7或我环境中的任何工具是否有可能破坏文件权限,以便文件在ASP.NET站点中变得无法使用?更重要的是,我该如何解决这个问题?
转出的确切文件权限错误是:
访问路径'// file //'被拒绝.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.UnauthorizedAccessException:拒绝访问路径'// file //'.
ASP.NET无权访问所请求的资源.考虑将资源的访问权限授予ASP.NET请求标识.ASP.NET具有基本进程标识(IIS 5上通常为{MACHINE}\ASPNET,IIS 6和IIS 7上为网络服务,IIS 7.5上已配置的应用程序池标识),如果应用程序未模拟,则使用该标识.如果应用程序模拟通过,则标识将是匿名用户(通常为IUSR_MACHINENAME)或经过身份验证的请求用户.
要授予对文件的ASP.NET访问权限,请在资源管理器中右键单击该文件,选择"属性",然后选择"安全"选项卡.单击"添加"以添加适当的用户或组.突出显示ASP.NET帐户,并选中所需访问的框.
但是干净的工作副本不会产生此错误.比较两者的权限,似乎没有被窃听的工作副本(与IUSR和本地帐户)共享,而破坏的工作副本没有共享,但共享永远不会被用户更改.
假设x是一个寄存器,其值不知道.我必须让x=2a+3b地方a和b有未知值.
我可以用8086个汇编指令mov,add,sub,neg只.mul不允许使用该指令,并且仅限4条指令.
它甚至可能吗?
目前我正在用C++构建我自己的脚本VM管理器类,我对任何lua&lua C或C++的东西没有任何问题,但是让我感到困惑的一个部分是:何时使用lua_pop以及何时使用lua_remove.
据我所知,lua_pop是从上到下删除多个值(在堆栈上),消除不再需要的数据,lua_remove从任意有效的堆栈索引中删除单个值(基本上是lua手册所说的)对于两者:P).
但我注意到的是散落混杂各地的网络代码ceratin段lua_pop和lua_remove,但是当我试图用lua_pop,而不是lua_remove在呼叫只是删除栈顶元素,我遇到了问题,那么将有可能得到一个明确的例子或解释如何以及何时正确使用这两个功能,以及这两个功能的相关速度和效率(我假设lua_pop比lua_remove这更快,这是我想lua_pop尽可能多地使用的原因之一,除了编码'正确的代码')
谢谢 :)
当使用gcc和-Waggregate-return标志尝试以下示例时,警告:function call has aggregate value触发器:
struct Element {
// ... stuff ...
}
Container<Element> elements(10);
for_each(begin(elements),end(elements),[](Element& e){
// ... modify elements ...
});
Run Code Online (Sandbox Code Playgroud)
据我所知,-Waggregate-return标志"警告,如果任何返回结构或联合的函数被定义或调用",因为,如果我理解正确,你可能会通过返回一个足够大的对象来溢出堆栈.
然而,for_each返回类型的拉姆达,其类型为void.为什么会触发警告?我错过了什么?我该如何改进我的代码?
我需要一种方法将指针标记为集合x的一部分或集合y的一部分(即:标记只有2个'状态'),我就是这意味着可以假设未标记= x和标记= y.
目前我正在寻找使用bitwise xor来做到这一点:
ptr ^ magic = encoded_ptr
encoded_ptr ^ magic = ptr
Run Code Online (Sandbox Code Playgroud)
但我很难知道如何确定指针是否在第一时间被标记.我用它来标记链表中的哪些池节点来自哪里,这样当它们脱链时,它们可以回到正确的perants.
更新
只是为了向所有那些建议将标志存储在额外数据成员中的人说清楚,我只限于sizeof(void*),所以我不能添加新成员,否则我会有.这些池也不是连续的,它们由许多页面组成,跟踪范围会增加太多的开销(我是在快速简单的解决方案之后,如果有人可以称之为).
我有一个问题wchar_t*要char*转换.
我wchar_t*从WinAPI函数FILE_NOTIFY_INFORMATION返回的结构中获取了一个字符串ReadDirectoryChangesW,所以我认为该字符串是正确的.
假设wchar字符串是"New Text File.txt"在Visual Studio调试器中,当悬停在变量上时显示"N"和一些未知的中文字母.虽然在手表中正确表示了字符串.
当我尝试将wchar转换为char时 wcstombs
wcstombs(pfileName, pwfileName, fileInfo.FileNameLength);
Run Code Online (Sandbox Code Playgroud)
它只将两个字母转换为char*("Ne"),然后生成错误.
在此块的函数_wcstombs_l_helper()中wcstombs.c中的一些内部错误:
if (*pwcs > 255) /* validate high byte */
{
errno = EILSEQ;
return (size_t)-1; /* error */
}
Run Code Online (Sandbox Code Playgroud)
它不会被视为异常.
可能是什么问题?
根据MSDN,消息有效载荷可以扩展到8KB(8192字节):
AddMessage方法将消息添加到队列的后面.消息最大可达8 KB.其内容必须采用可以使用UTF-8编码的格式.
但是,当在队列中添加消息时,我收到的消息的例外情况是,有效负载应该小于8192字节,魔术区域似乎大约是6500字节.我发送的数据是纯字符串,其大小是从.Length成员验证的,并且源是从源发送的长度验证的(CRLF分隔符有一个恒定的2字节差异).
所以我的问题是双重的:
1)是否有任何隐藏数据附加到消息有效负载上会导致其大小或导致这种奇怪的行为?(例如限制作为一个整体应用于对象,而不仅仅是它的有效载荷,但即便如此,它如何能够为每条消息占1.5KB?)
2)如何可靠地检查有效载荷是否确实低于8192?
还有一些额外的信息:我正在使用Azure SDK 1.4和VS 2010 Ultimate,运行计算和存储模拟器(我还没有部署这个应用程序)使用SQLExpress(我认为是2008).
还通过代码确认最大大小为8192字节(如果有一些额外的系统强制限制):
Trace.WriteLine("Max Queue Message Size: " + CloudQueueMessage.MaxMessageSize, "CloudQueueMessage");
Run Code Online (Sandbox Code Playgroud)
CloudQueueMessage:最大队列消息大小:8192
我正在创建一个“字符串”
char buffer[BUFFER_SIZE]
Run Code Online (Sandbox Code Playgroud)
但是当它变满时,我想将它连接到一个预先存在的字符串上,但它需要具有无限长度并重复这个过程,直到我读完所有数据。
关于我如何做到这一点的任何想法?