我正在进行一些吞吐量测试.我的申请必须
我的目标是模拟#2,"一些处理".也就是说,在转发事件之前引入延迟并占用CPU一段给定时间(例如500ms).
天真的方法是Thread.sleep(500).这会在执行中引入正确的延迟,但不会运行CPU.
计算斐波纳契数是一种选择. 有没有人使用任何有趣的技术只是为了让CPU在一段时间内保持忙碌状态?
理想的特征是:
我缺乏理解的一件事是如何为Intel CPU编译的代码可以在AMD CPU上运行.
我的基本理解是,如果编译C代码,例如,编译器将源代码转换为机器语言,该语言将具有特定处理器的指令.因此,您需要使用编译器为您希望应用程序使用的任何平台进行编译.为什么不需要针对AMD和Intel的编译器,并且必须为特定处理器购买软件?
我知道AMD处理器和英特尔处理器在较旧的x86指令中具有一些兼容性.我想知道的是他们是如何做到的?我的意思是,它不像AMD或英特尔相互呼唤并告诉对方他们的商业机密,那么他们如何创建兼容的指令集呢?
所有的兼容性仍然基于386指令集,有一堆语句,如"如果是AMD CPU,这个ELSE IF INTEL那样做"吗?
我知道无意识的无限循环通常会导致高CPU使用率.但是,我不太明白为什么.任何人都可以向我解释一下吗?
我必须用C#构建一个模拟器.该模拟器应该能够运行具有可配置CPU速度和有限RAM大小的第二个线程,例如144MHz和50MB.
当然我知道模拟器永远不会像真正的硬件一样准确.但我试着获得几乎相似的表现.
目前我正在考虑创建一个我将不时停止/休眠的线程.根据所需的CPU速度,模拟器应调整此线程的休眠时间,从而模拟不同的CPU频率.为了测量实现的速度我虽然使用PerformanceCounters.但是使用这种方法我遇到的问题是我不知道如何限制线程可以使用的RAM大小.
你对如何实现这样的模拟器有什么想法吗?
提前致谢!!
是否可以通过某些API或函数获取此类信息,而不是解析/proc/cpuinfo?
我知道这个问题已被多次询问过.我环顾四周,但似乎无法找到答案.
我确实找到了这段代码如何在C++中获取Windows下的内存使用情况.但它不会编译,我见过的所有其他答案都是关于如何获得单个进程cpu/ram的用法.
我有几个问题悬而未决几天没有答案.问题出现了,因为我有一个OpenMP和一个同样问题的OpenCL实现.OpenCL在GPU上运行完美,但在CPU上运行时性能降低了50%(与OpenMP实现相比).一篇文章已经在讨论OpenMP和OpenCL表演之间的区别,但它没有回答我的问题.目前我面临以下问题:
1)拥有" 矢量化内核 "(就英特尔离线编译器而言)真的那么重要吗?
有一个类似的帖子,但我认为我的问题更为笼统.
据我了解:矢量化内核不一定意味着编译后的二进制文件中没有向量/ SIMD指令.我检查了我的内核的汇编代码,并且有一堆SIMD指令.向量化内核意味着通过使用SIMD指令,您可以在一个CPU线程中执行4(SSE)或8(AVX)OpenCL"逻辑"线程.只有当所有数据连续存储在内存中时,才能实现此目的.但谁拥有如此完美排序的数据?
所以我的问题是:在这个意义上让内核"矢量化"真的很重要吗?
当然,它可以提高性能,但如果内核中的大多数计算密集型部分都是通过向量指令完成的,那么您可能会接近"最佳"性能.我认为我的问题的答案在于内存带宽.可能矢量寄存器更适合高效的存储器访问.在这种情况下,内核参数(指针)必须进行矢量化.
2)如果我在CPU上的本地内存中分配数据,它将在哪里分配?OpenCL将L1缓存显示为本地内存,但它显然与GPU本地内存上的内存类型不同.如果它存储在RAM /全局存储器中,那么将数据复制到其中是没有意义的.如果它在缓存中,其他一些进程可能会将其刷新......所以这也没有意义.
3)"逻辑"OpenCL线程如何映射到真正的CPU软件/硬件(Intel HTT)线程?因为如果我有短的运行内核并且内核像TBB(线程构建块)或OpenMP那样分叉,那么fork开销将占主导地位.
4)什么是线程叉开销?是否为每个"逻辑"OpenCL线程分叉了新的CPU线程,或者是一次分叉的CPU线程,并重用于更"逻辑"的OpenCL线程?
我希望我不是唯一一个对这些小事感兴趣的人,你们中的一些人现在可能会遇到这些问题.先感谢您!
UPDATE
3)目前OpenCL开销比OpenMP更重要,因此高效的运行时执行需要大量内核.在Intel OpenCL中,工作组映射到TBB线程,因此1个虚拟CPU核心执行整个工作组(或线程块).工作组使用3个嵌套for循环实现,如果可能,最内层循环被矢量化.所以你可以想象它是这样的:
#pragam omp parallel for
for(wg=0; wg < get_num_groups(2)*get_num_groups(1)*get_num_groups(0); wg++) {
for(k=0; k<get_local_size(2); k++) {
for(j=0; j<get_local_size(1); j++) {
#pragma simd
for(i=0; i<get_local_size(0); i++) {
... work-load...
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果最内部的循环可以进行矢量化,则可以使用SIMD步骤:
for(i=0; i<get_local_size(0); i+=SIMD) {
Run Code Online (Sandbox Code Playgroud)
4)每个TBB线程在OpenCL执行期间分叉一次并重用它们.每个TBB线程都绑定到一个虚拟核心,即.在计算过程中没有线程迁移.
我也接受@ natchouf的回答.
PRE-SCRIPTUM:
我搜索过StackOverflow并且没有Q/A解释调整WebRTC的所有可能性,以使其更适合最终产品.
问题:
WebRTC有一个非常好的用户体验,它正在削减优势.它应该是完美的网状电话(3-8人),但它还没有.网格调用的最大问题(所有参与者彼此交换流)是资源消耗,尤其是CPU.
以下是我想分享的一些统计数据:
2.3 GHz Intel Core i5(2核),OSX 10.10.2(14C109),4GB RAM,Chrome 40.0.2214.111(64位)
+------------------------------------+----------+----------+
| Condition | CPU | Delta |
+------------------------------------+----------+----------+
| Chrome (idle after getUserMedia) | 11% | 11% |
| Chrome-Chrome | 55% | 44% |
| Chrome-Chrome-Chrome | 74% | 19% |
| Chrome-Chrome-Chrome-Chrome | 102% | 28% |
+------------------------------------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
题:
我想创建一个WebRTC调整表,它可以改善资源消耗并提高整体体验.除了下表中的那些设置之外,我还可以使用其他任何设置吗?
+------------------------------------+--------------+----------------------+
| Tweak | CPU Effect | Affects |
+------------------------------------+--------------+----------------------+
| Lower FPS | Low to high | Video quality lower |
| Lower …Run Code Online (Sandbox Code Playgroud) 目前可以指定与特定操作的tf.device(...)函数一起使用哪个CPU或GPU,但是在哪里可以指定CPU 的核心?