英特尔的线程构建模块(TBB)开源库看起来非常有趣.即使有一篇关于这个主题的O'Reilly书,我也听不到有很多人在使用它.我有兴趣将它用于Unix(Mac,Linux等)环境中的一些多级并行应用程序(MPI +线程).对于它的价值,我对高性能计算/数值方法的各种应用感兴趣.
有没有人有TBB的经验?它运作良好吗?它是否相当便携(包括GCC和其他编译器)?这个范例是否适用于您编写的程序?我应该研究其他图书馆吗?
我有一个带有intel图形的eeepc.我想将一个脚本挂钩到通过VGA插入监视器的事件.怎么做?
我已经完成了ARM汇编编程,我想学习英特尔汇编程序.我一直听到所提到的所有这些不同的F/M/N/ASM-但我不确定它们与我希望实现的目标有什么关系?
有人可以帮我确定一下我需要学习如何在英特尔架构上编程低级别吗?我不太明白"不同的汇编程序"如何关联,x86,IA64,AMD64/x86-64等更是如此?
如果它有任何帮助,我最熟悉Eclipse和Visual Studio 08/10 IDE.
我试图通过迄今为止所有的sse补充,从旧的386基本指令学习最新的x86汇编.
我读了一些像SSE5这样的东西有170个新指令 - 我被催促知道它们目前有多少.
有些人可能会说它很难计算(因为它们中的一些很接近,但是在不同的类型参数上工作),但我认为它们可以通过一些合理的假设来计算如何将倍数计算为1.那么有人可以提供答案吗?
最好的答案是每个处理器扩展中有多少指令的表.
DWORD WINAPI MyThreadFunction(LPVOID lpParam) {
volatile auto x = 1;
for (auto i = 0; i < 800000000 / MAX_THREADS; ++i) {
x += i / 3;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此函数在MAX_THREADS线程中运行.
我已经使用Concand Visualizer 和Intel运行了Intel Core 2 Duo,Windows 7,MS Visual Studio 2012上的测试.(4个线程)在7.1秒内完成,但是(50个线程)在5.8秒内完成,同时有更多的上下文切换.
我在英特尔酷睿i5,Mac OS 10.7.5上运行了相同的测试,并得到了相同的结果.MAX_THREADS=4MAX_THREADS=50test1test2test1test2
假设我正在使用AVX2的VGATHERDPS - 这应该使用8个DWORD索引加载8个单精度浮点数.
当要加载的数据存在于不同的缓存行中时会发生什么?指令是作为硬件循环实现的,它逐个获取缓存行吗?或者,它是否可以立即向多个缓存行发出负载?
我读了几篇论述前者的文章(这是对我更有意义的文章),但我想更多地了解这一点.
链接到一篇论文:http://arxiv.org/pdf/1401.7494.pdf
我最近写一些的OpenGL 3.3代码与顶点数组对象(VAO)并测试它以后英特尔图形适配器,我发现,我感到失望,该元件阵列缓冲器结合显然不是VAO状态的一部分,作为呼叫:
glBindVertexArray(my_vao);
glDrawElements(GL_TRIANGLE_STRIP, count, GL_UNSIGNED_INTEGER, 0);
Run Code Online (Sandbox Code Playgroud)
没有效果,而:
glBindVertexArray(my_vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, my_index_buffer); // ?
glDrawElements(GL_TRIANGLE_STRIP, count, GL_UNSIGNED_INTEGER, 0);
Run Code Online (Sandbox Code Playgroud)
渲染几何体.我认为这是在英特尔执行的OpenGL(因为它是在GL_ARB_vertex_array_object即使在GL_OES_vertex_array_object明确提出(和)该元素阵列的一个单纯的错误是保存状态的一部分),但随后在移动的NVIDIA Quadro 4200发生这不好玩.
它是我的代码中的驱动程序错误,规格错误或错误吗?代码在GeForce 260和480上完美运行.
有没有类似的经历?
什么也奇怪的是,GL_EXT_direct_state_access不具有结合元件阵列缓冲器到VAO的函数(但是它确实有功能来指定顶点ATTRIB阵列,因此阵列缓冲器).GPU制造商是否违反规范并欺骗我们,或者是什么?
编辑:
我原本不打算显示任何源代码,因为我认为这里没有必要.但是根据要求,这是重现问题的最小测试用例:
static GLuint n_vertex_buffer_object, p_index_buffer_object_list[3];
static GLuint p_vao[2];
bool InitGLObjects()
{
const float p_quad_verts_colors[] = {
1, 0, 0, -1, 1, 0,
1, 0, 0, 1, 1, 0,
1, 0, 0, 1, -1, 0,
1, 0, 0, -1, -1, 0, // red quad
0, 0, 1, -1, 1, 0,
0, 0, 1, …Run Code Online (Sandbox Code Playgroud) 因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么
我找到了这个解释:
代码段(CS)是一个16位寄存器,包含带有处理器指令的64 KB段的地址.处理器使用CS段来访问指令指针(IP)寄存器引用的指令.CS寄存器不能直接更改.CS寄存器在远跳,远程调用和远程返回指令期间自动更新.
这对于IP:
指令指针(IP)是一个16位寄存器.
我真的不明白这基本上意味着什么,所以如果有人能提供更"生动"的解释,那就太棒了:)
我希望我将问题简化为一个简单且可重复的测试用例.源(在此处)包含10个相同的简单循环副本.每个循环的形式如下:
#define COUNT (1000 * 1000 * 1000)
volatile uint64_t counter = 0;
void loopN(void) {
for (int j = COUNT; j != 0; j--) {
uint64_t val = counter;
val = val + 1;
counter = val;
}
return;
}
Run Code Online (Sandbox Code Playgroud)
变量的'volatile'很重要,因为它强制值在每次迭代时从内存中读取和写入.使用'-falign-loops = 64'将每个循环对齐到64个字节,并生成相同的程序集,除了对全局的相对偏移量:
400880: 48 8b 15 c1 07 20 00 mov 0x2007c1(%rip),%rdx # 601048 <counter>
400887: 48 83 c2 01 add $0x1,%rdx
40088b: 83 e8 01 sub $0x1,%eax
40088e: 48 89 15 b3 07 20 00 …Run Code Online (Sandbox Code Playgroud)