我已经看到处理器包可用于 Visual Studio 6,但它似乎只对使用 SP5 的用户可用,而且我已经在使用 SP6:
此外,Visual C++ 处理器包 (VCPP) 已从 Service Pack 6 中删除。如果您安装了 VCPP,安装 SP6 会将其从您的计算机中删除。如果您希望继续使用 VCPP,则需要继续使用 SP5 或迁移到 Visual Studio 2002 或 2003(推荐)。
首先,这个处理器包是否与 Visual Studio 6 SP6 兼容?
其次,它真的会帮助我吗?我担心从我的应用程序中获得最大收益,但它需要在所有类型的 Intel 和 AMD 芯片上运行,所以我不能只针对一个平台。
performance visual-c++-6 intel visual-studio-6 amd-processor
我目前正在学习与英特尔并行化库相关的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和特殊设备的特殊情况.我只对一般的内存保证感兴趣:我的排序只是我最感兴趣的一点,因为它对并发算法最重要.
当我查看最近处理器的图表和概述时 [1],我从未看到提及 MMX 寄存器 MM0 - MM7。但从规格来看,它们似乎仍然存在。可以依赖它们存在于支持 SSE 的所有处理器中吗?除了更旧的 FPU 堆栈之外,它们是否与其他任何东西冲突?它们是否与一般 64 位的物理寄存器相同?
虽然 XMM 和 YMM 对于向量要好得多,但我偶尔想使用 MMX 寄存器来存储值,否则这些值会溢出到堆栈中。Speedwise 这看起来好一点,而且有时我想避免额外的商店和负载。
遇到过一种简单的.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) 我写了一个简单的测试(代码在底部)来memcpy对我的 64 位 Debian 系统的性能进行基准测试。在我的系统上编译为 64 位二进制文件时,这在所有块大小上提供了一致的 38-40GB/s。然而,当在同一系统上构建为 32 位二进制文件时,复制性能非常糟糕。
我在汇编程序中编写了自己的 memcpy 实现,该实现利用了能够匹配 64 位性能的 SIMD。老实说,我自己的 memcpy 比原生的快得多,这让我感到震惊,当然 32 位 libc 构建肯定有问题。
0x00100000 B, 0.034215 ms, 29227.06 MB/s (16384 iterations)
0x00200000 B, 0.033453 ms, 29892.56 MB/s ( 8192 iterations)
0x00300000 B, 0.048710 ms, 20529.48 MB/s ( 5461 iterations)
0x00400000 B, 0.049187 ms, 20330.54 MB/s ( 4096 iterations)
0x00500000 B, 0.058945 ms, 16965.01 MB/s ( 3276 iterations)
0x00600000 B, 0.060735 ms, 16465.01 MB/s ( 2730 iterations)
0x00700000 B, …Run Code Online (Sandbox Code Playgroud) 现在我计划在32位,64位,Windows XP Home,Windows XP Pro,Windows Vista Home Basic,Windows Vista Ultimate,Windows 7 Home Basic和Windows 7 Ultimate上进行测试......所有这些都包含最新的服务包.
但是,现在我想知道是否值得对AMD和英特尔进行上述所有列出的场景测试,还是浪费时间?
注意:这是日常普通用户的安全应用程序.
因此,我正在试着让一些代码在OpenCL中运行.
由于我没有得到最初的预期结果,我一直在尝试各种方法来弄清楚出了什么问题.所以我想出了下面附带的代码,并且在成功执行后它没有产生预期的结果.
此代码的最初愿景是执行指定数量的线程并将线程号复制到数组中.
Threads: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
然而,我得到的结果.
Threads: 0 0 0 3 0 0 0 7 0 0 0 11 0 0 0 15
Run Code Online (Sandbox Code Playgroud)
结果我得到了他们的模式.所以每一个
(n % 4)
Run Code Online (Sandbox Code Playgroud)
它似乎在我的数组中放了一个数字.我开始考虑是否由于某种原因将代码视为int并转换为char.
gcc main.c -o threadsopencl -std=c99 -framework OpenCL
#ifdef __APPLE__
#include <OpenCL/opencl.h>
#else
#include <CL/cl.h>
#endif
#include <stdlib.h> // warning: implicit declaration of function ‘malloc’
#include <stdio.h> // …Run Code Online (Sandbox Code Playgroud) 我有一个在 Intel 和 AMD x86 机器上运行的应用程序的 MASM 同步代码。
我想使用 Intel TSX 前缀来增强它,特别是 XACQUIRE 和 XRELEASE。
如果我为 Intel 正确修改了我的代码,当我尝试在 AMD 机器上运行它时会发生什么?英特尔表示,它们被设计为向后兼容,这大概意味着它们在没有 TSX 的英特尔 CPU 上什么都不做。
我知道 AMD 还没有实施 TSX。但是这些前缀在 AMD CPU 上运行是否安全?这种行为是否记录在 AMD 手册中的某处,还是假设这是安全的并且永远是安全的?
x86 assembly backwards-compatibility amd-processor intel-tsx
我在 x64 模式下使用 VS 2019(版本 16.8.6)编译了以下 C++17 代码:
struct __declspec(align(16)) Vec2f { float v[2]; };
struct __declspec(align(16)) Vec4f { float v[4]; };
static constexpr std::uint64_t N = 100'000'000ull;
const Vec2f p{};
Vec4f acc{};
// Using virtual method:
for (std::uint64_t i = 0; i < N; ++i)
acc += foo->eval(p);
// Using function pointer:
for (std::uint64_t i = 0; i < N; ++i)
acc += eval_fn(p);
Run Code Online (Sandbox Code Playgroud)
在第一个循环中,foo是一个std::shared_ptr和eval()是一个虚方法:
__declspec(noinline) virtual Vec4f eval(const Vec2f& p) const noexcept …Run Code Online (Sandbox Code Playgroud)