在x86_64上使用gcc 4.4.5(是的......我知道它已经老了).出于兼容性原因,仅限于SSE2(或更早)的说明.
我认为应该是一个教科书案例,以获得预取的巨大好处.我有一个32位元素的数组("A"),它不是(也可能不是)按顺序排列的.这些32位元素是__m128i数据的较大数据数组("D")的索引.为"A"的各要素,我需要在"d"从适当的位置取__m128i数据,在其上执行的操作,并且将其存储回在"d"的相同位置.实际上D中的每个"条目"都是"SOME_CONST"__m128i的大.因此,如果A中的值为"1",则D中的索引为D [1*SOME_CONST].
由于"A"中的连续元素几乎不会指向"D"中的连续位置,因此我倾向于认为硬件预取器将会挣扎或无法完成任何有用的操作.
但是,我可以很容易地预测下一个我将要访问的位置,只需在"A"中向前看即可.足够的措辞......这里有一些代码.我对数据执行的操作是取__m128i的低64位并将其克隆到相同的高64位.首先是基本循环,没有多余的装饰......
// SOME_CONST is either 3 or 4, but this "operation" only needs to happen for 3
for ( i=0; i<arraySize; ++i )
{
register __m128i *dPtr = D + (A[i] * SOME_CONST);
dPtr[0] = _mm_shuffle_epi32( dPtr[0], 0 | (1<<2) | (0<<4) | (1<<6) );
dPtr[1] = _mm_shuffle_epi32( dPtr[1], 0 | (1<<2) | (0<<4) | (1<<6) );
dPtr[2] = _mm_shuffle_epi32( dPtr[2], 0 | (1<<2) | (0<<4) | (1<<6) );
// The immediate operand selects:
// …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我需要在一个大的连续内存数据块(100个MB)上执行计算.我想的是继续预取我的程序将来会触及的块的部分,这样当我对该部分执行计算时,数据已经在缓存中.
有人能给我一个简单的例子来说明如何用gcc实现这个目标吗?我在_mm_prefetch某处读过,但不知道如何正确使用它.另请注意,我有一个多核系统,但每个核心将并行处理不同的内存区域.
该内部函数导说,只有这么多关于void _mm_prefetch (char const* p, int i):
从包含地址p的内存中获取数据行到由locality hint i指定的缓存层次结构中的位置.
你能列出int i参数的可能值并解释它们的含义吗?
我发现_MM_HINT_T0,_MM_HINT_T1,_MM_HINT_T2,_MM_HINT_NTA和_MM_HINT_ENTA,但我不知道这是否是一个详尽的列表和它们的含义.
如果特定于处理器,我想知道他们在Ryzen和最新的英特尔酷睿处理器上做了什么.
我想使用预取,我不能让它工作!这是我的代码:
function initAutocompletion() {
$("input[data-autocomplete-prefetch-url]").each(function () {
var $this = $(this);
var urlPrefetch = $this.data("autocomplete-prefetch-url");
var prefetch;
pref = {
url: urlPrefetch,
filter: filter
};
var bloodHound = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
limit: 10,
prefetch: pref
});
bloodHound.initialize();
$this
.typeahead('destroy')
.typeahead({
hint: true,
highlight: true,
minLength: 1
},
{
displayKey: 'value',
source: bloodHound.ttAdapter()
});
});
}
function filter(list) {
return $.map(list, function (v) { return { value: v.toString() }; });
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.
如果我使用远程而不是预取它工作!
var bloodHound = new Bloodhound({ …Run Code Online (Sandbox Code Playgroud) 给定一个JSON API端点/api/config,我们试图<link rel="prefetch" href="/api/config">在HTML文档的头部使用.当Chrome访问HTML中的链接标记时,Chrome会按预期下载数据,但是稍后会通过XHR从我们的脚本再次请求数据.
服务器配置为允许缓存,并Cache-Control: "max-age=3600, must-revalidate"在标头中进行响应.当Chrome再次请求数据时,服务器会以304 Not Modified状态正确响应.
用例是这样的:将始终使用XHR(AngularJS解析,如果相关)从我们的单页面应用程序中的Javascript请求配置端点.但是,我们的脚本非常大并且需要很长时间才能解析,因此在解析完成之前不会请求JSON配置.预取将允许我们使用一些解析时间来从API端点获取和缓存响应,否则必须等待脚本加载.
我是否必须单独预取子域?
例如,当我这样<link rel="dns-prefetch" href="//example.com">做时,我还需要一个额外的标签//static.example.com?
我正在尝试<link rel="dns-prefetch">和<link rel="preconnect">标签,我正在试图看看它们是否对我的网站有所帮助.我找不到任何有关如何使用浏览器开发工具,扩展程序或其他软件验证这些提示是否有效的在线资源.您似乎只是根据某些标准评估它们是否对您有用,然后将它们放入并希望获得最佳效果.
在我的情况下,我有一个单页应用程序,它呈现<body>浏览器中的所有内容,因此浏览器无法真正扫描初始HTML以预测域要解析,所以看起来这似乎对我有用.
我有一个模型预订,其中有一个历史.像这样,我使用django_simple_history
class Booking(CreatedAtAbstractBase):
history = HistoricalRecords()
Run Code Online (Sandbox Code Playgroud)
我使用管理命令来完成任务.我想在预订时预取历史记录
booking_p_history = Booking.history.filter(s_id=6).order_by(
'updated_at').first()
booking_obj_list = Booking.objects.select_related(...) \
.prefetch_related(
Prefetch('booking_history', queryset=booking_p_history, to_attr='driver_pickup_history')
,'booking_history') \
.filter(...)
Run Code Online (Sandbox Code Playgroud)
如何在预取中使用简单的历史记录?
我仍在学习 tensorflow 和 keras,我怀疑这个问题有一个非常简单的答案,我只是因为不熟悉而错过了。
我有一个PrefetchDataset对象:
> print(tf_test)
$ <PrefetchDataset shapes: ((None, 99), (None,)), types: (tf.float32, tf.int64)>
Run Code Online (Sandbox Code Playgroud)
...由特征和目标组成。我可以使用for循环遍历它:
> for example in tf_test:
> print(example[0].numpy())
> print(example[1].numpy())
> exit()
$ [[-0.31 -0.94 -1.12 ... 0.18 -0.27]
[-0.22 -0.54 -0.14 ... 0.33 -0.55]
[-0.60 -0.02 -1.41 ... 0.21 -0.63]
...
[-0.03 -0.91 -0.12 ... 0.77 -0.23]
[-0.76 -1.48 -0.15 ... 0.38 -0.35]
[-0.55 -0.08 -0.69 ... 0.44 -0.36]]
[0 0 1 0 1 0 0 0 1 0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用TF的新功能,即Data API,我不确定prefetch的工作原理.在下面的代码中
def dataset_input_fn(...)
dataset = tf.data.TFRecordDataset(filenames, compression_type="ZLIB")
dataset = dataset.map(lambda x:parser(...))
dataset = dataset.map(lambda x,y: image_augmentation(...)
, num_parallel_calls=num_threads
)
dataset = dataset.shuffle(buffer_size)
dataset = dataset.batch(batch_size)
dataset = dataset.repeat(num_epochs)
iterator = dataset.make_one_shot_iterator()
Run Code Online (Sandbox Code Playgroud)
在我上面的每一行之间有关系dataset=dataset.prefetch(batch_size)吗?或者也许它应该是在output_buffer_size数据集来自何时将要使用的每个操作之后tf.contrib.data?
prefetch ×10
x86-64 ×3
dns ×2
html ×2
performance ×2
python ×2
tensorflow ×2
bloodhound ×1
c ×1
c++ ×1
caching ×1
cpu-cache ×1
django ×1
http ×1
intrinsics ×1
javascript ×1
keras ×1
linux ×1
simd ×1
sse ×1
typeahead ×1