答案_mm_prefetch() 局部性提示是什么?详细说明提示的含义。
\n我的问题是:我想要哪一个?
\n我正在研究一个被重复调用数十亿次的函数,其中一些int参数。我做的第一件事是使用该参数(其低 32 位)作为 4GB 缓存的键来查找一些缓存值。根据调用该函数的算法,我知道该密钥通常会从一次调用到下一次调用加倍(左移 1 位),所以我这样做:
int foo(int key) {\n uint8_t value = cache[key];\n _mm_prefetch((const char *)&cache[key * 2], _MM_HINT_T2);\n // ...\nRun Code Online (Sandbox Code Playgroud)\n目标是拥有这个value在下次调用该函数时将其放入处理器缓存中。
我正在寻找对我对两点的理解的确认:
\n_mm_prefetch不会延迟紧随其后的指令的处理。该函数使用 128 128 位值(总共 2 KB)的查找表。有没有办法 \xe2\x80\x9cforce\xe2\x80\x9d 它被缓存?该查找表的索引按顺序递增;我也应该预取它们吗?我可能应该使用另一个提示来指向另一个级别的缓存?这里最好的策略是什么?
\n我想将一些代码预取到指令缓存中.代码路径很少使用,但我需要它在指令缓存中,或者至少在L2中用于极少数情况下使用它.我预先通知了这些罕见的情况._mm_prefetch是否适用于代码?有没有办法在缓存中获得这种不经常使用的代码?对于这个问题,我不关心可移植性,所以即使asm会这样做.
我无法在typeahead.js中获取预取功能,但它可以很好地处理本地数据.我首先尝试链接到返回json对象或列表的servlet,但过了一段时间我放弃了它并开始检查提供的示例.因此,他们的示例链接到如下所示的页面:http: //twitter.github.io/typeahead.js/data/countries.json 但是,即使我做了与他们完全相同的事情,当我将它链接到该页面时,我的脚本甚至不起作用.我尝试将该文件复制到我的本地工作区并链接到那里无济于事.为了检查它是否正在进行任何调用我每次收到get请求时都会使servlet崩溃,当我运行自动完成示例页面时它确实崩溃了,因此它不是缓存问题.我尝试将jquery降级到1.9.1,但这也不起作用(目前使用1.10).我尝试使用不同版本的typeahead.js.我尝试使用Internet Explorer和谷歌浏览器查看错误是否存在.
必须有一些我缺少的重要内容,因为我已经用尽了我能想到的每一个错误来源.其他人似乎没有任何问题让这个工作.
这是我使用的代码:
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>Demo</title>
<link rel="stylesheet" type="text/css" href="typeahead.js-bootstrap.css">
</head>
<body>
<script src="jquery.js"></script>
<script src="typeahead.js"></script>
<input type="text" class="typeahead" placeholder="test" />
<script>
$(document).ready(function() {$('.typeahead').typeahead({
name: "Auto" ,
ttl_ms: 10000,
prefetch: 'http://twitter.github.io/typeahead.js/data/countries.json',
//local: ['abc', 'acd', 'ade', 'bcd]
});});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我很难弄清楚如何使用typeahead以json文件作为源来显示对象列表.我的数据都没有显示出来.
我想列出名称,并在选择时将其他属性用于其他内容.
../data/test.json
[
{"name": "John Snow", "id": 1},
{"name": "Joe Biden", "id": 2},
{"name": "Bob Marley", "id": 3},
{"name": "Anne Hathaway", "id": 4},
{"name": "Jacob deGrom", "id": 5}
]
Run Code Online (Sandbox Code Playgroud)
test.js
$(document).ready(function() {
var names = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.whitespace("name"),
queryTokenizer: Bloodhound.tokenizers.whitespace,
prefetch: {
url: '../data/test.json'
}
});
names.initialize();
$('#test .typeahead').typeahead({
name: 'names',
displayKey: 'name',
source: names.ttAdapter()
});
)};
Run Code Online (Sandbox Code Playgroud)
的test.html
<div id="test">
<input class="typeahead" type="text">
</div>
Run Code Online (Sandbox Code Playgroud)
**如果有人能向我解释一下datumTokenizer和queryTokenizer是什么,那就太棒了**
我在x86和x86-64上已经了解到这一点,英特尔gcc提供了特殊的预取指令:
#include <xmmintrin.h>
enum _mm_hint
{
_MM_HINT_T0 = 3,
_MM_HINT_T1 = 2,
_MM_HINT_T2 = 1,
_MM_HINT_NTA = 0
};
void _mm_prefetch(void *p, enum _mm_hint h);
Run Code Online (Sandbox Code Playgroud)
程序可以_mm_prefetch在程序中的任何指针上使用内在函数.并且与_mm_prefetch
内在函数一起使用的不同提示是实现定义的.一般来说,每个提示都有其自身的含义.
_MM_HINT_T0将 数据提取到包含高速缓存的所有高速缓存级别以及用于独占高速缓存的最低级别高速缓存
_MM_HINT_T1提示将数据拉入L2而不是L1d.如果有一个L3缓存,_MM_HINT_T2 提示可以为它做类似的事情
_MM_HINT_NTA,允许告诉处理器专门处理预取的缓存行
那么当有人使用这条指令时,有人会描述一些例
以及如何正确选择提示?
我有一个相当重要的问题,我的计算图有周期和多个"计算路径".我没有做一个调度程序循环,每个顶点将被逐个调用,我有一个想法是将所有预先分配的"框架对象"放在堆中(代码+数据).
这有点类似于线程代码(甚至更好:CPS),只是在堆中跳转,执行代码.每个代码段与堆中自己的"帧指针"相关联,并使用与之相关的数据.帧始终保持分配状态.代码只在已知位置产生副作用,计算(如果需要)下一个goto值并跳转到那里.
我还没有尝试过(这将是一个重要的事情,使它正确,我完全意识到所有的困难)所以我想问x86机械专家:它能比调度程序循环更快吗?我知道在硬件中进行的调用/返回指令有几种优化.
访问相对于堆栈指针的数据或任何其他指针之间有区别吗?是否有预取间接跳转(跳转到存储在寄存器中的值?).
这个想法是否可行?
PS如果你已经读过这个并且仍然无法理解这个想法的意思(原谅我尝试解释事情的失败)想象这整个就像是一堆堆上的预先分配的协同程序,彼此相互影响.标准x86堆栈未在进程中使用,因为所有内容都在堆上.
我正在优化我的 ORM 查询。我有两个应用程序,“app1”和“app2”。一类“app2”具有指向一类 app1 的外键,如下所示:
#app1/models.py
class C1App1(WithDateAndOwner):
def get_c2_app2(self):
res = self.c2app2_set.all()
if res.count() > 0:
return res[0]
else:
return None
#app2/models.py
class C2App2(WithDateAndOwner):
c1app1 = models.ForeignKey("app1.C1App1")
is_ok = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)
现在我在管理页面中显示 C1App1 的所有实例的 C2App2:
#app1/admin.py
@admin.register(C1App1)
class C1App1Admin(admin.MyAdmin):
list_display = ("get_c2_app2")
list_select_related = ()
list_prefetch_related = ("c2app2_set",)
list_per_page = 10
Run Code Online (Sandbox Code Playgroud)
prefetch_related 减少这个查询:
SELECT ••• FROM `app2_c2app2` WHERE `app2_c2app2`.`c1app1_id` = 711
Duplicated 19 times.
Run Code Online (Sandbox Code Playgroud)
到:
SELECT ••• FROM `app2_c2app2` WHERE `app2_c2app2`.`c1app1_id` IN (704, 705, 706, 707, 708, 709, 710, 711, …Run Code Online (Sandbox Code Playgroud) 我读了很多博客,每个人都提到 Next.js 预取链接,但它对我不起作用。
这是我尝试过的代码:
import Link from 'next/link'
export default function Home() {
return (
<div >
<Link href="/home">
<a>Home</a>
</Link>
<Link href="/About/about">
<a>About</a>
</Link>
</div>
)
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序来分析社交网络图.这意味着程序需要大量的随机内存访问.在我看来,预取应该有所帮助.这是从顶点的邻居读取值的一小段代码.
for (size_t i = 0; i < v.get_num_edges(); i++) {
unsigned int id = v.neighbors[i];
res += neigh_vals[id];
}
Run Code Online (Sandbox Code Playgroud)
我将上面的代码转换为下面的代码,并预取顶点的邻居值.
int *neigh_vals = new int[num_vertices];
for (size_t i = 0; i < v.get_num_edges(); i += 128) {
size_t this_end = std::min(v.get_num_edges(), i + 128);
for (size_t j = i; j < this_end; j++) {
unsigned int id = v.neighbors[j];
__builtin_prefetch(&neigh_vals[id], 0, 2);
}
for (size_t j = i; j < this_end; j++) {
unsigned int id = v.neighbors[j];
res …Run Code Online (Sandbox Code Playgroud) prefetch ×10
c++ ×3
gcc ×2
performance ×2
typeahead.js ×2
assembly ×1
bloodhound ×1
c ×1
core ×1
cpu-cache ×1
django ×1
django-admin ×1
intrinsics ×1
javascript ×1
jquery ×1
json ×1
low-latency ×1
next.js ×1
x86 ×1