【发布时间】:2010-04-29 16:53:11
【问题描述】:
我正在编写一些代码,我正在尝试尽可能优化它,基本上让它在一定的时间限制下运行。
下面的调用...
static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);
...下面是执行的内容。
void operator()(const blocked_range<size_t> &r) const {
int temp;
int i;
int j;
size_t k;
size_t begin = r.begin();
size_t end = r.end();
for(k = begin; k != end; ++k) { // for each trainee
temp = 0;
for(i = 0; i < N; ++i) { // for each sample
int trr = trRating[k][i];
int ei = E[i];
for(j = 0; j < ei; ++j) { // for each expert
temp += delta(i, trr, exRating[j][i]);
}
}
myscore[k] = temp;
}
}
我正在使用英特尔的 TBB 来优化它。但我也一直在阅读有关 SIMD 和 SSE2 以及类似性质的内容。所以我的问题是,如何将变量 (i,j,k) 存储在寄存器中,以便 CPU 可以更快地访问它们?我认为答案与实现 SSE2 或它的一些变体有关,但我不知道该怎么做。有什么想法吗?
编辑:这将在 Linux 机器上运行,但我相信使用英特尔的编译器。如果有帮助,我必须在执行任何操作以确保编译器工作之前运行以下命令... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ...然后编译我做: icc -ltbb test.cxx -o test
如果没有简单的方法来实现 SSE2,有什么建议可以进一步优化代码吗?
谢谢, 赫里斯托
【问题讨论】:
-
编译器应该为你做这种事情。
-
@zdav:C++ 的语义排除了向量化,因为默认情况下指针可能是未对齐的或别名的。
-
ICC 允许您提供嵌入在代码中的提示,以帮助它更好地进行矢量化。当然,如果您无法控制所提供数据的对齐方式等,那么这将无济于事。