某些CPU和编译器提供预取指令.例如:GCC文档中的 __builtin_prefetch .虽然GCC的文件中有评论,但它对我来说太短了.
我想知道,在prantice中,我们应该何时使用预取?有一些例子吗?谢谢!
我在prefetch_related具有 5 m2m 字段的模型上遇到了一些严重的性能问题,并且我正在预取一些嵌套的 m2m 字段。
class TaskModelManager(models.Manager):
def get_queryset(self):
return super(TaskModelManager, self).get_queryset().exclude(internalStatus=2).prefetch_related("parent", "takes", "takes__flags", "assignedUser", "assignedUser__flags", "asset", "asset__flags", "status", "approvalWorkflow", "viewers", "requires", "linkedTasks", "activities")
class Task(models.Model):
uuid = models.UUIDField(primary_key=True, default=genOptimUUID, editable=False)
internalStatus = models.IntegerField(default=0)
parent = models.ForeignKey("self", blank=True, null=True, related_name="childs")
name = models.CharField(max_length=45)
taskType = models.ForeignKey("TaskType", null=True)
priority = models.IntegerField()
startDate = models.DateTimeField()
endDate = models.DateTimeField()
status = models.ForeignKey("ProgressionStatus")
assignedUser = models.ForeignKey("Asset", related_name="tasksAssigned")
asset = models.ForeignKey("Asset", related_name="tasksSubject")
viewers = models.ManyToManyField("Asset", blank=True, related_name="followedTasks")
step = models.ForeignKey("Step", blank=True, null=True, …Run Code Online (Sandbox Code Playgroud) 我想将模型属性预取到 Django 中的查询集。有没有办法做到这一点?
以下是三个模型:
class Place(models.Model):
name = models.CharField(max_length=200, blank=True)
@property
def bestpicurl(self):
try:
return self.placebestpic.picture.file.url
except:
return None
class PlaceBestPic(models.Model):
place = models.OneToOneField(Place)
picture = models.ForeignKey(Picture, on_delete=models.CASCADE)
class Picture(models.Model):
file = ImageField(max_length=500, upload_to="/images/")
Run Code Online (Sandbox Code Playgroud)
我需要类似的东西:
qs = Place.objects.all().select_related('bestpicurl')
Run Code Online (Sandbox Code Playgroud)
任何线索如何做到这一点?谢谢!
这是一个场景,一个包含多个投标的项目模型。
Class Project(models.Model):
user = models.ForeignKey()
Class Bid(models.Model):
project = models.ForeignKey(Project, related_name='bids')
Run Code Online (Sandbox Code Playgroud)
当我们查询项目时,我们想要预取项目的投标。
Project.objects.filter(whatever condition).prefetch_related(
Prefetch('bids', queryset=Bid.objects.all())
)
Run Code Online (Sandbox Code Playgroud)
这里我们只想获取属于过滤项目的投标,而不是所有投标,我们如何指定呢?我期待类似的事情
queryset=Bid.objects.filter(project=project?)...
Run Code Online (Sandbox Code Playgroud)
谢谢。
请帮忙!
[+] 我有什么: 每个桶里都有很多斑点。Blob 的大小各不相同,从小于千字节到大量千兆字节。
[+] 我想做的事情: 我需要能够在这些 blob 中传输数据(比如大小为 1024 的缓冲区或类似的东西),或者在 Python 中按一定大小的块读取它们。关键是我不认为我可以只执行bucket.get_blob(),因为如果blob是TeraByte那么我将无法将它保存在物理内存中。
[+] 我真正想做的事情: 解析 blob 内的信息以识别关键字
[+] 我读过的内容: 很多关于如何分块写入谷歌云,然后使用 compose 将其拼接在一起的文档(一点帮助都没有)
很多关于java的预取函数的文档(需要是python)
谷歌云API
如果有人能指出我正确的方向,我将非常感激!谢谢
我有一个64字节大小的对象:
typedef struct _object{
int value;
char pad[60];
} object;
Run Code Online (Sandbox Code Playgroud)
在主要我正在初始化对象数组:
volatile object * array;
int arr_size = 1000000;
array = (object *) malloc(arr_size * sizeof(object));
for(int i=0; i < arr_size; i++){
array[i].value = 1;
_mm_clflush(&array[i]);
}
_mm_mfence();
Run Code Online (Sandbox Code Playgroud)
然后再次遍历每个元素。这是我正在为以下事件计数的循环:
int tmp;
for(int i=0; i < arr_size-105; i++){
array[i].value = 2;
//tmp = array[i].value;
_mm_mfence();
}
Run Code Online (Sandbox Code Playgroud)
拥有mfence在这里没有任何意义,但是我在捆绑其他东西,无意间发现,如果我有存储操作,而没有mfence,我将收到50万次RFO请求(以papi L2_RQSTS.ALL_RFO事件衡量),这意味着另外50万L1命中,在需求之前预取。但是,包含mfence会导致一百万个RFO请求,从而产生RFO_HIT,这意味着仅在L2中预取了缓存行,不再在L1缓存中预取了。
除了英特尔文档以某种方式另有说明的事实之外:“可以在执行MFENCE指令之前,之中或之后将数据推测性地带入缓存”。我检查了加载操作。如果没有mfence,我最多可获得2000 L1命中率,而如果具有mfence,则我最多可获得100万L1命中率(以papi MEM_LOAD_RETIRED.L1_HIT事件衡量)。高速缓存行在L1中预取以用于加载指令。
因此,不应该包含mfence块预取。存储和加载操作几乎都需要花费相同的时间-不需5-6毫秒,而需20毫秒。我经历了有关mfence的其他问题,但未提及预取对它的预期行为,我没有看到足够好的理由或解释,为什么它仅使用存储操作会阻止L1缓存中的预取。还是我可能缺少某些功能描述?
我正在Skylake微体系结构上进行测试,但是与Broadwell进行了核对,并获得了相同的结果。
如何在动态路由导入中禁用rel="prefetch"?
我正在使用 @vue/cli 4.3.1 和 Webpack 4.43.0,尝试禁用预取:
在route.js中
const Registration = () => import( /* webpackPrefetch: false */
/* webpackChunkName: "registration" */ '../modules/Popup/Registration.vue')
Run Code Online (Sandbox Code Playgroud)
尝试在 vue.config.js 中配置,但没有帮助
chainWebpack: config => {
config.plugins.delete('prefetch')
config.plugins.delete('prefetch-index') // or
config.plugins.delete('preload')
}
Run Code Online (Sandbox Code Playgroud)
但无论如何都有
<link rel="prefetch" ....>
Run Code Online (Sandbox Code Playgroud) 我想使用指令_mm_prefetch.MSDN 指定它在头文件mmintrin.h中,但没有.我使用Visual Studio 2012.
我有两个数组:A用N_A随机整数和B使用N_B之间的随机整数0和(N_A - 1).我在以下循环中使用数字B作为索引A:
for(i = 0; i < N_B; i++) {
sum += A[B[i]];
}
Run Code Online (Sandbox Code Playgroud)
在Intel i7-3770(N_A= 2.56亿,N_B= 6400万)上进行试验,此循环仅需0.62秒,这相当于大约9纳秒的内存访问延迟.
由于这个延迟太小,我想知道硬件预取器是否正在发挥作用.有人可以提供解释吗?
简单的MWE:
int* ptr = (int*)malloc(64 * sizeof(int));
_mm_prefetch((const char*)(ptr + 64), _MM_HINT_0);
Run Code Online (Sandbox Code Playgroud)
我问,因为我可以在编译器生成的代码中看到这样的预取,其中在循环预取内部完成而不检查地址(存储在rbx)中:
400e73: 49 83 c5 40 add r13,0x40
400e77: 62 f1 f9 08 28 03 vmovapd zmm0,ZMMWORD PTR [rbx]
400e7d: 4d 3b ec cmp r13,r12
400e80: 62 d1 f9 08 eb 4d ff vporq zmm1,zmm0,ZMMWORD PTR [r13-0x40]
400e87: 90 nop
400e88: 62 d1 78 08 29 4d ff vmovaps ZMMWORD PTR [r13-0x40],zmm1
400e8f: 72 03 jb 400e94 <main+0x244>
400e91: 49 89 c5 mov r13,rax …Run Code Online (Sandbox Code Playgroud)