我正在分析一个应用程序在运行 linux 的 x86-64 处理器上的执行时间。在开始对应用程序进行基准测试之前,我想确保禁用动态频率缩放和空闲状态。
$ cat /sys/devices/system/cpu/cpufreq/boost
0
Run Code Online (Sandbox Code Playgroud)
这告诉我频率缩放(Intel 的 Turbo Boost 或 AMD 的 Turbo Core)被禁用。事实上,我们将其设置为恒定的 2GHz,这在下一个练习中很明显。
$ cpupower --cpu 0-63 idle-info
CPUidle driver: none
CPUidle governor: menu
analyzing CPU 0:
CPU 0: No idle states
analyzing CPU 1:
CPU 1: No idle states
analyzing CPU 2:
CPU 2: No idle states
...
Run Code Online (Sandbox Code Playgroud)
因此,空闲状态被禁用。现在我确定可以干扰基准测试的两个“功能”都被禁用,我继续使用 cpupower 监视应用程序。
但是,当我运行我的应用程序来监控 C 状态时,我发现超过 99% 的时间都花在了 C0 状态,这应该是这种情况。但是,我也看到了一种称为 Cx 状态的东西,其中内核花费了 0.01 - 0.02% 的时间。
$ cpupower monitor -c ./my_app …Run Code Online (Sandbox Code Playgroud) 如果我将x86平台作为我的.NET应用程序的目标,它会在AMD芯片上正常运行吗?我知道它可以与英特尔芯片配合使用,并且Vista 64能够以特殊模式运行x86应用程序,但我不知道有多少是硬件,有多少是操作系统.
我已经在Vista 64上使用英特尔芯片进行了测试,它运行良好,但我没有AMD机器进行测试.
我观察到,与Intel CPU相比,我在AMD处理器上执行java应用程序的速度要快得多.
例如,我的JBoss在3 GHz AMD处理器上启动大约30秒,在具有相同光盘,RAM和操作系统的3 GHz Intel处理器上需要大约60秒?
还有其他人做过这个观察吗?为什么会这样?
AMD为每个GPU系列定义其ISA.据我所知,ISA是一个指令集架构:类似汇编的"语言".怎样称为NVidia的GPU"汇编式语言"? - PTX?是否有像AMD或Intel离线编译器这样的工具为NVidia内核生成这样的程序集?谢谢
我已经编写了一个OpenCL内核,该内核使用opencl-opengl互操作性来读取顶点和索引,但是这可能甚至不重要,因为我只是在做简单的指针加法操作,以便按索引获取特定的顶点。
uint pos = (index + base)*stride;
Run Code Online (Sandbox Code Playgroud)
在这里,我正在计算绝对位置(以字节为单位),在我的示例中pos是28,643,328,步幅为28,索引= 0,基数= 1,022,976。好吧,这似乎是正确的。
不幸的是,我不能vload3直接使用,因为offset参数不是以字节为单位的绝对地址。所以我只添加pos了指针void* vertices_gl
void* new_addr = vertices_gl+pos;
Run Code Online (Sandbox Code Playgroud)
new_addr 在我的示例中= 0x2f90000,这是奇怪部分开始的地方,
vertices_gl = 0x303f000
结果(new_addr)应为0x4B90000(0x303f000 + 28,643,328)
我不明白为什么地址vertices_gl减少了716,800(0xAF000)
我的目标是GPU:AMD Radeon HD5830
附言:对于那些想知道的人,我正在使用printf来获取这些值:)(无法使CodeXL工作)
我是并行计算和OpenCL的新手.我按照OpenCLProgramming指南.在卷积实现部分.
我的main.cpp:
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <OpenCL/OpenCL.h>
using namespace std;
const unsigned int inputSignalWidth = 8;
const unsigned int inputSignalHeight = 8;
cl_uint inputSignal[inputSignalWidth][inputSignalHeight] =
{
{3, 1, 1, 4, 8, 2, 1, 3},
{4, 2, 1, 1, 2, 1, 2, 3},
{4, 4, 4, 4, 3, 2, 2, 2},
{9, 8, 3, 8, 9, 0, 0, 0},
{9, 3, 3, 9, 0, 0, 0, 0},
{0, 9, 0, 8, 0, 0, 0, 0},
{3, …Run Code Online (Sandbox Code Playgroud) 我相信 Windows 已经在内部使用该指令很长时间了,所以 CPU 制造商会花精力去优化吗?
当然,假设适当对齐的内存和不共享缓存线等。
我是 OS 的学习者,正在尝试编写内核。
我在谷歌上搜索了“AMD x2APIC”,发现一些关于 EPYC 7002 系列的信息似乎支持它。
但我找不到相关文档。
所以我想问一下最近的AMD处理器是否支持它,如果是,我在哪里可以找到文档。
我开发了一个类似于 Java for C++ 的监视器对象,并进行了一些改进。主要的改进是不仅有一个用于锁定和解锁的自旋循环,而且还有一个用于等待事件的自旋循环。在这种情况下,您不必锁定互斥体,而是在 wait_poll 函数上提供谓词,并且代码反复尝试锁定互斥体轮询,如果它可以锁定互斥体,则它会调用返回(或移动)一对的谓词bool 和结果类型。
即使调用立即返回,等待内核中的信号量和/或事件对象 (Win32) 也很容易花费 1.000 到 10.000 个时钟周期,因为之前已经设置了信号量或事件。因此,必须有一个与该等待间隔具有合理关系的旋转计数,其中旋转的时间是内核中所花费的最小间隔的十分之一。
通过我的监控对象,我从 glibc 中获取了自旋计数重新计算算法。我还使用暂停指令。但我发现在我的CPU(TR 3900X)上暂停指令太快了。平均约为 0.78ns。在 Intel-CPU 上,它更合理,约为 30 纳秒。
这是代码:
#include <iostream>
#include <chrono>
#include <cstddef>
#include <cstdint>
#include <immintrin.h>
using namespace std;
using namespace chrono;
int main( int argc, char **argv )
{
static uint64_t const PAUSE_ROUNDS = 1'000'000'000;
auto start = high_resolution_clock::now();
for( uint64_t i = PAUSE_ROUNDS; i; --i )
_mm_pause();
double ns = (int64_t)duration_cast<nanoseconds>( high_resolution_clock::now() - start ).count() / (double)PAUSE_ROUNDS;
cout << …Run Code Online (Sandbox Code Playgroud) 当我打开任务管理器时,我可以看到每次使用 Android Studio 时我的 CPU 使用率都会变高。我在物理设备上运行我的应用程序,但高使用率仍然存在。如果我开始在 Android Studio 上编码,CPU 使用率就会飙升至 99% 等等。我使用的是 AMD Ryzen 3,内存为 8GB。我该如何解决这个问题?我希望你可以帮助我!