标签: prefetch

如何从预取内在函数中获得可衡量的好处?

在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)

performance sse x86-64 simd prefetch

16
推荐指数
1
解决办法
649
查看次数

预取数据以缓存x86-64

在我的应用程序中,我需要在一个大的连续内存数据块(100个MB)上执行计算.我想的是继续预取我的程序将来会触及的块的部分,这样当我对该部分执行计算时,数据已经在缓存中.

有人能给我一个简单的例子来说明如何用gcc实现这个目标吗?我在_mm_prefetch某处读过,但不知道如何正确使用它.另请注意,我有一个多核系统,但每个核心将并行处理不同的内存区域.

c linux caching x86-64 prefetch

15
推荐指数
2
解决办法
1万
查看次数

什么是_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和最新的英特尔酷睿处理器上做了什么.

c++ x86-64 prefetch intrinsics cpu-cache

15
推荐指数
1
解决办法
7077
查看次数

typeahead,bloodhound:远程工作但不预取

我想使用预取,我不能让它工作!这是我的代码:

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)

prefetch typeahead bloodhound

14
推荐指数
2
解决办法
1万
查看次数

可以使用链接预取来缓存JSON API响应以用于以后的XHR请求吗?

给定一个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端点获取和缓存响应,否则必须等待脚本加载.

html javascript google-chrome prefetch browser-cache

14
推荐指数
1
解决办法
1704
查看次数

DNS预取子域名

我是否必须单独预取子域?

例如,当我这样<link rel="dns-prefetch" href="//example.com">做时,我还需要一个额外的标签//static.example.com

html dns performance prefetch

13
推荐指数
2
解决办法
1542
查看次数

如何测试dns-prefetch和preconnect的效果

我正在尝试<link rel="dns-prefetch"><link rel="preconnect">标签,我正在试图看看它们是否对我的网站有所帮助.我找不到任何有关如何使用浏览器开发工具,扩展程序或其他软件验证这些提示是否有效的在线资源.您似乎只是根据某些标准评估它们是否对您有用,然后将它们放入并希望获得最佳效果.

在我的情况下,我有一个单页应用程序,它呈现<body>浏览器中的所有内容,因此浏览器无法真正扫描初始HTML以预测域要解析,所以看起来这似乎对我有用.

dns http prefetch

13
推荐指数
2
解决办法
3308
查看次数

在django_simple_history中使用prefetch_related

我有一个模型预订,其中有一个历史.像这样,我使用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)

如何在预取中使用简单的历史记录?

python django prefetch django-simple-history

13
推荐指数
1
解决办法
444
查看次数

从 Tensorflow PrefetchDataset 中提取目标

我仍在学习 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)

python machine-learning prefetch keras tensorflow

13
推荐指数
2
解决办法
1万
查看次数

Tensorflow Data API - 预取

我正在尝试使用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 tensorflow tensorflow-datasets

12
推荐指数
1
解决办法
9019
查看次数