我正在研究一些代码,并且正在尝试尽可能多地优化它,基本上使其在一定的时间限制下运行。

以下呼叫...

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框上运行,但我相信使用Intel的编译器。如果有帮助,我必须在执行任何操作之前运行以下命令以确保编译器的工作...源/opt/intel/compiler/11.1/064/bin/intel/intel64/iccvars_intel64.csh; source/opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ...

如果没有简单的方法来实现SSE2,则有关如何进一步优化代码的任何建议?

谢谢,赫里斯托

有帮助吗?

解决方案

您的问题对发生的事情表示了一些混乱。假设您正在对ICC调用中进行优化(应该这样做),则几乎可以肯定的是,I,J,K变量已肯定已经存在于寄存器中。

您可以使用 asm 块,但是考虑到您已经在使用ICC的一种更简单的方法是使用SSE Interins。英特尔为他们的文档在这里 - http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/comm1019.htm

看来您可以将顶级循环缩小,尽管这将在很大程度上取决于您的 delta 功能是。

其他提示

当您想在C ++模块中使用汇编语言时,可以将其放入 asm 块,然后继续从块外部使用您的变量名称。您在 asm Block将指定正在运行的寄存器等,但它们会因平台而异。

如果您正在使用GCC,请参阅 http://gcc.gnu.org/projects/tree-ssa/vectorization.html 有关如何帮助编译器自动矢量化您的代码和示例。

否则,您需要让我们知道您正在使用的平台。

编译器应该为您执行此操作。例如,在VC ++中,您可以简单地打开SSE2。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top