我在为最新的hadoop-2.2版本启动namenode时遇到以下错误.我没有在hadoop bin文件夹中找到winutils exe文件.我试过下面的命令
$ bin/hdfs namenode -format
$ sbin/yarn-daemon.sh start resourcemanager
ERROR [main] util.Shell (Shell.java:getWinUtilsPath(303)) - Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278)
at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:300)
at org.apache.hadoop.util.Shell.<clinit>(Shell.java:293)
at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:76)
at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.main(ResourceManager.java:863)
Run Code Online (Sandbox Code Playgroud) 我对通过Post()或SendAsync()发送项目之间的区别感到困惑.我的理解是,在所有情况下,一旦项目到达数据块的输入缓冲区,控制权将返回到调用上下文,对吗?那为什么我需要SendAsync?如果我的假设不正确,那么我想,相反,如果使用数据块的整个想法是建立并发和异步环境,为什么有人会使用Post().
我当然理解技术上的差异,Post()返回一个bool,而SendAsync返回一个等待bool的任务.但是它有什么影响呢?何时返回bool(我理解是否确认该项是否放在数据块的队列中)会被延迟?我理解async/await并发框架的一般概念,但在这里并没有多大意义,因为除了bool之外,对传入项所做的任何操作的结果都不会返回给调用者,而是放在一个"out-queue"并转发到链接数据块或丢弃.
发送项目时两种方法之间是否存在性能差异?
c# concurrency message-passing task-parallel-library tpl-dataflow
我在理解参考的地点方面遇到了问题.任何人都可以帮助我理解它的含义和内容,
据我所知,硬件预取器至少会检测并通过内存获取持续的步幅.此外,它可以监控数据访问模式,无论真正意味着什么.这让我想知道,硬件预取程序是否会根据存储在内存中的实际数据做出决定,还是纯粹基于程序所展示的行为?
我问的原因是因为我偶尔会使用"非本地"指针作为指针.一个简单的例子就是预分配的东西数组,以及索引这个数组而不是指针的小整数.如果我需要存储大量这样的"指针",内存的节省可以快速增加,并通过使用更少的内存间接提高缓存性能.
但据我所知,这可能会干扰硬件预取器的工作方式.或不!
我可以想象,现实与否,预取单元检查进入L1缓存的缓存行以获取本机指针地址并开始将它们提取到L2或某些此类事物中.在那种情况下,我拯救记忆的聪明伎俩突然变得不那么聪明了.
那么,现代硬件预取器的作用是什么呢?他们可以被"非本地"指针绊倒吗?
我正在使用Cachegrind,Callgrind和Gem5进行一些实验.我注意到一些访问被计为cachegrind的读取,如callgrind的写入以及gem5的读取和写入.
我们来看一个非常简单的例子:
int main() {
int i, l;
for (i = 0; i < 1000; i++) {
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
... (100 times)
}
}
Run Code Online (Sandbox Code Playgroud)
我编译:
gcc ex.c --static -o ex
所以基本上,根据asm文件,addl $1, -8(%rbp)
执行100,000次.由于它既是读取也是写入,我期待100k读取和100k写入.但是,cachegrind只将它们计为read,而callgrind只计为write.
% valgrind --tool=cachegrind --I1=512,8,64 --D1=512,8,64
--L2=16384,8,64 ./ex
==15356== Cachegrind, a cache and branch-prediction profiler
==15356== Copyright (C) 2002-2012, and GNU GPL'd, by Nicholas Nethercote et al.
==15356== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info …
Run Code Online (Sandbox Code Playgroud) 我需要根据x86机器指令数来估计程序中某些热点的确切起始位置(以便稍后可以在某个仿真器/模拟器中运行).有没有办法使用gdb来计算执行到断点的机器指令的数量?
当然还有其他选择,我可以使用仿真/二进制检测工具(如Pin),并在计算指令时跟踪运行,但这需要在我工作的每个平台上安装此工具 - 并非总是可行.我需要一些可以在任何Linux机器上使用的工具.
用GDB,我想它也可以运行stepi X
,直到我们遇到断点过大的进步是某种粗粒搜索,然后降低分辨率重复,但是这将是极为缓慢.还有另一种方法吗?
我从这个链接(https://gist.github.com/jiewmeng/3787223)获得了这个程序.我一直在网上搜索,以便更好地理解处理器缓存(L1和L2).我想成为能够编写一个程序,让我能够猜测我的新笔记本电脑上L1和L2缓存的大小.(仅用于学习目的.我知道我可以检查规格.)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define KB 1024
#define MB 1024 * 1024
int main() {
unsigned int steps = 256 * 1024 * 1024;
static int arr[4 * 1024 * 1024];
int lengthMod;
unsigned int i;
double timeTaken;
clock_t start;
int sizes[] = {
1 * KB, 4 * KB, 8 * KB, 16 * KB, 32 * KB, 64 * KB, 128 * KB, 256 * KB,
512 * KB, 1 * MB, 1.5 …
Run Code Online (Sandbox Code Playgroud) 我正在为intel core i7构建缓存模拟器,但很难找到L1,L2和L3缓存(共享)的详细规范.我需要Cacheblock大小,缓存大小,关联性等等......有人能指出我的好方向吗?
我正在尝试学习循环优化.我发现循环平铺有助于使数组循环更快.我尝试使用下面给出的两个代码块,有或没有循环阻塞,并测量两者的时间.我大部分时间都没有发现明显的差异.我测试了不同的块大小,但我不知道如何选择块大小.如果我的方向错了,请帮助我.实际上我发现没有块的循环可以更快地工作.
一个.随着阻止
int max = 1000000;
int B = 100;
for (i = 0; i < max; i += B)
{
for (j = i; j < (i + B); j++)
{
array[j] = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
湾 没有阻止
for (i = 0; i < max; i++)
{
array[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
所用时间:阻塞:经过时间 - 6997000 Nano Secs
没有阻塞经过的时间 - 6097000 Nano Secs
cpu-cache ×5
c ×4
caching ×3
c++ ×2
optimization ×2
performance ×2
assembly ×1
c# ×1
cachegrind ×1
callgrind ×1
concurrency ×1
erase ×1
gdb ×1
gem5 ×1
hadoop ×1
intel ×1
loops ×1
memory ×1
posix ×1
prefetch ×1
tpl-dataflow ×1
trace ×1
unix ×1
x86 ×1