这个问题在我的问题上继续(根据神秘的建议):
继续我的问题,当我使用压缩指令而不是标量指令时,使用内在函数的代码看起来非常相似:
for(int i=0; i<size; i+=16) {
y1 = _mm_load_ps(output[i]);
…
y4 = _mm_load_ps(output[i+12]);
for(k=0; k<ksize; k++){
for(l=0; l<ksize; l++){
w = _mm_set_ps1(weight[i+k+l]);
x1 = _mm_load_ps(input[i+k+l]);
y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1));
…
x4 = _mm_load_ps(input[i+k+l+12]);
y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4));
}
}
_mm_store_ps(&output[i],y1);
…
_mm_store_ps(&output[i+12],y4);
}
Run Code Online (Sandbox Code Playgroud)
这个内核的测量性能是每个周期大约5.6个FP操作,虽然我预计它将是标量版本性能的4倍,即每个周期4.1,6 = 6,4 FP操作.
考虑到权重因素的移动(感谢指出这一点),时间表如下:

看起来调度没有改变,尽管在操作之后有一条额外的指令movss将标量权重值移动到XMM寄存器然后用于shufps在整个向量中复制这个标量值.似乎权重向量已经准备好用于mulps考虑从加载到浮点域的切换延迟,因此这不应该产生任何额外的延迟.
此内核中使用的movaps(对齐,打包的移动)addps和mulps指令(使用汇编代码检查)与其标量版本具有相同的延迟和吞吐量,因此这不会产生任何额外的延迟.
有没有人知道每8个周期的额外周期花费在哪里,假设这个内核可以获得的最大性能是每个周期6.4个FP运算并且每个周期运行5.6个FP运算?
顺便说一下,这是实际装配的样子:
…
Block x:
movapsx (%rax,%rcx,4), %xmm0
movapsx 0x10(%rax,%rcx,4), %xmm1
movapsx 0x20(%rax,%rcx,4), %xmm2
movapsx 0x30(%rax,%rcx,4), %xmm3
movssl …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有一个乘法添加内核,我想提高它的性能.
我使用英特尔酷睿i7-960(3.2 GHz时钟)并已使用SSE内在函数手动实现内核,如下所示:
for(int i=0; i<iterations; i+=4) {
y1 = _mm_set_ss(output[i]);
y2 = _mm_set_ss(output[i+1]);
y3 = _mm_set_ss(output[i+2]);
y4 = _mm_set_ss(output[i+3]);
for(k=0; k<ksize; k++){
for(l=0; l<ksize; l++){
w = _mm_set_ss(weight[i+k+l]);
x1 = _mm_set_ss(input[i+k+l]);
y1 = _mm_add_ss(y1,_mm_mul_ss(w,x1));
…
x4 = _mm_set_ss(input[i+k+l+3]);
y4 = _mm_add_ss(y4,_mm_mul_ss(w,x4));
}
}
_mm_store_ss(&output[i],y1);
_mm_store_ss(&output[i+1],y2);
_mm_store_ss(&output[i+2],y3);
_mm_store_ss(&output[i+3],y4);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用压缩的fp向量来提高性能,我已经成功完成了,但我想知道为什么单个标量代码无法满足处理器的峰值性能.
我的机器上的这个内核的性能是每个周期大约1.6个FP操作,而每个周期最大的是2个FP操作(因为FP add + FP mul可以并行执行).
如果我对研究生成的汇编代码是正确的,理想的时间表将如下所示,其中mov指令需要3个周期,从依赖指令的加载域到FP域的切换延迟需要2个周期,FP乘以4个循环,FP添加需要3个循环.(注意,乘法 - > add的依赖性不会导致任何切换延迟,因为操作属于同一个域).

根据测量的性能(最大理论性能的约80%),每8个周期有大约3个指令的开销.
我想要:
当然,存在缓存未命中和数据错位的问题,这可能会增加移动指令的延迟,但是还有其他因素可以在这里发挥作用吗?像寄存器读取档位或什么?
我希望我的问题很明确,在此先感谢您的回复!
更新:内循环的程序集如下所示:
...
Block 21:
movssl (%rsi,%rdi,4), %xmm4
movssl (%rcx,%rdi,4), %xmm0
movssl 0x4(%rcx,%rdi,4), %xmm1 …Run Code Online (Sandbox Code Playgroud) 我想扩展android.util.Log该类以写入设备内部存储器中的日志文件,最好也是特定的TAGS.
我目前有一个实现:
public class CustomLogger{
private final static Logger fileLog = Logger.getLogger(MainActivity.class);
private Context context;
public CustomLogger(Context c){
this.context = c;
final LogConfigurator logConfigurator = new LogConfigurator();
logConfigurator.setFileName(context.getFilesDir() + File.separator + "myApp.log");
logConfigurator.setRootLevel(Level.DEBUG);
logConfigurator.setLevel("org.apache", Level.ERROR);
logConfigurator.configure();
}
public void i(String TAG, String message){
// Printing the message to LogCat console
Log.i(TAG, message);
// Write the log message to the file
fileLog.info(TAG+": "+message);
}
public void d(String TAG, String message){
Log.d(TAG, message);
fileLog.debug(TAG+": "+message);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,此自定义记录器会将内容存储(使用 …
当我使用英特尔编译器编译应用程序时,它比我用GCC编译它时要慢.英特尔编译器的输出速度慢了2倍.该应用程序包含几个嵌套循环.GCC和我缺少的英特尔编译器之间是否存在任何差异?我是否需要打开其他一些标志来提高英特尔编译器的性能?我预计英特尔编译器的速度至少与GCC一样快.
编译器版本:
Intel version 12.0.0 20101006 GCC version 4.4.4 20100630
编译器标志与两个编译器相同:
-O3 -openmp -parallel -mSSE4.2 -Wall -pthread
Run Code Online (Sandbox Code Playgroud) 我有一个关于我的核心i7 920的FP峰值性能的问题.我有一个应用程序执行大量的MAC操作(基本上是卷积操作),我无法通过一个因素达到CPU的峰值FP性能当使用多线程和SSE指令时,大约是8倍.当试图找出原因是什么时,我最终得到了一个简化的代码片段,在单个线程上运行而不使用同样糟糕的SSE指令:
for(i=0; i<49335264; i++)
{
data[i] += other_data[i] * other_data2[i];
}
Run Code Online (Sandbox Code Playgroud)
如果我是正确的(数据和other_data数组都是FP),这段代码需要:
49335264 * 2 = 98670528 FLOPs
Run Code Online (Sandbox Code Playgroud)
它执行时间约为150毫秒(我非常确定这个时间是正确的,因为C计时器和英特尔VTune Profiler给出了相同的结果)
这意味着此代码段的性能如下:
98670528 / 150.10^-3 / 10^9 = 0.66 GFLOPs/sec
Run Code Online (Sandbox Code Playgroud)
这个CPU的峰值性能应该是2*3.2 GFlops/sec(2 FP单元,3.2 GHz处理器)对吗?
这个巨大的差距有什么解释吗?因为我无法解释它.
非常感谢,我真的可以使用你的帮助!
intel ×4
c ×3
assembly ×2
instructions ×2
performance ×2
android ×1
c++ ×1
gcc ×1
logging ×1
optimization ×1
sse ×1