gpt4 book ai didi

c++ - 在 C++ 中实现 SIMD

转载 作者:行者123 更新时间:2023-11-28 03:57:49 25 4
gpt4 key购买 nike

我正在处理一些代码,我正在尝试尽可能地优化它,基本上让它在一定的时间限制内运行。

以下调用...

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,关于如何进一步优化代码有什么建议吗?

谢谢,赫里斯托

最佳答案

您的问题代表了对正在发生的事情的一些困惑。 i、j、k 变量几乎肯定已经保存在寄存器中,假设您正在编译优化(您应该这样做 - 添加“-O2”到您的 icc 调用)。

您可以使用 asm block ,但考虑到您已经在使用 ICC,更简单的方法是使用 SSE 内部函数。英特尔的文档在这里 - http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/comm1019.htm

看起来您可以对顶层循环进行 SIMD 化,尽管这在很大程度上取决于您的 delta 函数是什么。

关于c++ - 在 C++ 中实现 SIMD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2739191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com