是否可以使用Cilk Plus Array Notation在“if”块语句中使用“__sec_implicit_ind

Is it possible to use `__sec_implicit_index` inside an `if` block statement using Cilk Plus Array Notation?

本文关键字:语句 sec ind implicit if Plus Cilk 可以使 Array Notation 是否      更新时间:2023-10-16

我的目标是在英特尔icc编译器13.1.3 20130607版本中使用Cilk Plus array Notation,根据隐式索引值有条件地为数组赋值。

考虑以下代码:

    T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    if(test[:] < 5) {
        test[:] = 10 - __sec_implicit_index(0);
    }

这段代码编译得很好,但当我尝试运行它时,我会得到以下错误:

undefined symbol: __sec_implicit_index

注意尽管这看起来像是一个链接错误,但事实并非如此,因为以下代码编译并运行良好(条件已删除)

T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
test[:] = 10 - __sec_implicit_index(0);

那么,我的问题是:是否可以使用Cilk Plus数组符号来完成下面条件代码的行为?

    T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    for(int i = 0; i < 10; i++) {
        if(i < 5) {
            test[i] = 10 - i;
        }
    }

这个例子是正确的。问题是icc 13.1.3中的一个错误。icc14.0测试版为我正确编译并执行了这个例子。

对于icc 13.1.3,我发现#pragma simd通常更可靠,作为指示向量化权限的一种方式。有了它,您的示例看起来像:

T test[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
#pragma simd
for(int i = 0; i < 10; i++) {
    if(i < 5) {
        test[i] = 10 - i;
    }
}

它当然失去了数组表示法的方便性。