我的公司已经开始让许多客户打电话,因为我们的程序因其系统上的访问冲突而崩溃.
崩溃发生在SQLite 3.6.23.1中,我们将其作为应用程序的一部分提供.(我们提供自定义构建,以便使用与应用程序其余部分相同的VC++库,但这是SQLite代码库存.)
pcache1Fetch执行时发生崩溃call 00000000,如WinDbg调用堆栈所示:
0b50e5c4 719f9fad 06fe35f0 00000000 000079ad 0x0
0b50e5d8 719f9216 058d1628 000079ad 00000001 SQLite_Interop!pcache1Fetch+0x2d [sqlite3.c @ 31530]
0b50e5f4 719fd581 000079ad 00000001 0b50e63c SQLite_Interop!sqlite3PcacheFetch+0x76 [sqlite3.c @ 30651]
0b50e61c 719fff0c 000079ad 0b50e63c 00000000 SQLite_Interop!sqlite3PagerAcquire+0x51 [sqlite3.c @ 36026]
0b50e644 71a029ba 0b50e65c 00000001 00000e00 SQLite_Interop!getAndInitPage+0x1c [sqlite3.c @ 40158]
0b50e65c 71a030f8 000079ad 0aecd680 071ce030 SQLite_Interop!moveToChild+0x2a [sqlite3.c @ 42555]
0b50e690 71a0c637 0aecd6f0 00000000 0001edbe SQLite_Interop!sqlite3BtreeMovetoUnpacked+0x378 [sqlite3.c @ 43016]
0b50e6b8 71a109ed 06fd53e0 00000000 071ce030 SQLite_Interop!sqlite3VdbeCursorMoveto+0x27 [sqlite3.c @ 50624]
0b50e824 71a0db76 071ce030 …Run Code Online (Sandbox Code Playgroud) 我们一直是英特尔商店.所有开发人员都使用英特尔机器,最终用户的推荐平台是英特尔,如果最终用户希望在AMD上运行,那就是他们的了望.也许测试部门有一台AMD机器在哪里检查我们没有运送任何完全损坏的东西,但那是关于它的.
直到几年前我们才使用MSVC编译器,因为它并没有真正提供超出SSE级别的许多处理器调优选项,所以没有人担心代码是否有利于x86供应商而不是另一个.但是,最近我们一直在使用英特尔编译器.我们的东西肯定会从它(在我们的英特尔硬件上)获得一些显着的性能优势,并且它的矢量化功能意味着更少需要去asm/intrinsics.然而,人们开始对英特尔编译器是否真的不能为AMD硬件做得如此出色而感到有些紧张.当然,如果你进入英特尔CRT或IPP库,你会看到许多cpuid查询显然设置跳转表到优化的功能.看起来英特尔似乎不太可能为AMD芯片做任何好事.
任何有这方面经验的人都可以评论这在实践中是否是一个大问题?(我们还没有真正对AMD进行任何性能测试).
更新2010-01-04:支持AMD的需求从来没有变得足够让我自己做任何测试.还有在这个问题上一些有趣的阅读在这里,这里和这里虽然.
更新2010-08-09:看来英特尔-FTC和解有话要说这个问题-请参阅"编译器和肮脏的把戏"的部分文章.
无论如何在使用AMD处理器时通过Eclipse运行Android虚拟设备?我有一段时间的Genymotion,尽管它起作用,但是涉及到太多的麻烦.
valgrind --leak-check=full ./CH02_HelloTriangle
==11404== Memcheck, a memory error detector
==11404== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==11404== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==11404== Command: ./CH02_HelloTriangle
==11404==
==11404== Jump to the invalid address stated on the next line
==11404== at 0x0: ???
==11404== by 0x6F9271A: ??? (in /usr/lib/fglrx/dri/fglrx_dri.so)
==11404== Address 0x0 is not stack'd, malloc'd or (recently) free'd
==11404==
==11404==
==11404== Process terminating with default action of signal 11 (SIGSEGV)
==11404== …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我希望在多个进程之间共享一个GPU.也就是说,这些进程中的每一个都会创建自己的CUDA或OpenCL上下文,目标是相同的GPU.根据Fermi白皮书[1],应用程序级上下文切换小于25微秒,但是在GPU上启动时启动有效地序列化 - 因此Fermi不能很好地完成这项工作.根据Kepler白皮书[2],有一种叫做Hyper-Q的东西允许来自多个CUDA流,MPI进程或进程内线程的多达32个同时连接.
我的问题:是否有人在Kepler GPU上尝试过此操作并验证其内核是否在从不同进程调度时同时运行?这只是一个CUDA功能,还是可以在Nvidia GPU上与OpenCL一起使用?AMD的GPU是否支持类似的东西?
[2] http://www.nvidia.com/content/PDF/kepler/NVIDIA-Kepler-GK110-Architecture-Whitepaper.pdf
我编写了一个程序,可以捕获并显示来自三个视频卡的视频.对于每一帧,我产生一个线程,将帧压缩为Jpeg,然后将其放入队列以写入磁盘.我还有其他线程从这些文件中读取并在自己的线程中解码它们.通常情况下这很好用,它是一个相当CPU密集型的程序,占所有六个CPU内核的70-80%.但过了一会儿,编码突然变慢,程序无法足够快地处理视频并开始丢帧.如果我检查CPU利用率,我可以看到一个核心(通常是核心5)不再做太多了.
发生这种情况时,如果我退出并重新启动程序并不重要.CPU 5的利用率仍然很低,程序会立即开始丢帧.删除所有已保存的视频也没有任何效果.重新启动计算机是唯一有用的.哦,如果我将我的程序的亲和力设置为使用除半空闲核心以外的所有核心,它将起作用直到另一个核心发生同样的情况.这是我的设置:
我的应用使用:
在我看来,Linux在核心上调度线程的方式会出现某种问题.或者是否有某种方式我的程序可能会如此糟糕,以至于无法重启程序?
感谢您阅读,欢迎任何和所有输入.我被困了:)
我目前正在学习与英特尔并行化库相关的API,如TBB,MKL和IPP.不过,我想知道它是否也值得关注AMD的部分难题.或者这只是浪费时间?(我必须承认,我对AMD的图书馆支持毫无头绪 - 所以 - 如果您有任何建议,我将不胜感激.)
只是为了澄清,我采用英特尔方式的原因是因为1)API非常好; 2)英特尔似乎像API支持一样认真对待工具支持.(再一次,我不知道 AMD在这个部门的表现如何.)
关于我在下面描述的顺序,我有一些相关的问题.
鉴于这些排序保证,我在许多地方不需要明确的围栏.但是,如何向编译器表达"栅栏",特别是GCC?也就是说,只要优化器不重新排序我的程序,程序顺序的保证才适用.
是否有普通/流行的新芯片使用通用内核而不提供此类保证?
我在C++ 0x中对它的交错思想感到有点困惑.我必须使用"原子"类来利用这些保证,还是草案中还有其他一些方面也提供了一种利用这些保证的方法?
记忆订购
英特尔和AMD(至少使用x86_64)都保证内存负载与单处理器上的存储操作相关.也就是说,如果某个处理器执行这些存储:
一些其他处理器看到C(3)的那一刻,它保证也能看到先前的存储A(1)和B(2).现在,处理器之间的可见性可以是交错的,但来自任何给定处理器的存储顺序也将是顺序的.
当处理器0读取处理器1存储的值,然后写入一个值时,它们也具有传递保证,读取新值的处理器2也必须从处理器1中看到该值.
忽略处理IO和特殊设备的特殊情况.我只对一般的内存保证感兴趣:我的排序只是我最感兴趣的一点,因为它对并发算法最重要.
遇到过一种简单的.net fibonniacci代码在一组特定服务器上速度较慢的情况,唯一明显不同的是CPU.AMD Opteron处理器6276 - 11秒Intel Xeon XPU E7 - 4850 - 7秒
代码遵循x86并使用.NET framework 4.0.两者之间的速度相似,实际上PassMark基准测试为AMD提供了更高的分数. - 在农场的其他AMD服务器上试过这个,时间慢了. - 即使我的本地I7机器运行代码更快.
Fibonnacci代码:
class Program
{
static void Main(string[] args)
{
const int ITERATIONS = 10000;
const int FIBONACCI = 100000;
var watch = new Stopwatch();
watch.Start();
DoFibonnacci(ITERATIONS, FIBONACCI);
watch.Stop();
Console.WriteLine("Total fibonacci time: {0}ms", watch.ElapsedMilliseconds);
Console.ReadLine();
}
private static void DoFibonnacci(int ITERATIONS, int FIBONACCI)
{
for (int i = 0; i < ITERATIONS; i++)
{
Fibonacci(FIBONACCI);
}
}
private static int Fibonacci(int x) …Run Code Online (Sandbox Code Playgroud)