info C5012:由于'1007'

时间:2017-04-26 13:08:41

标签: c visual-studio-2013 vectorization c11 sse2

我正在x86_64上尝试Visual Studio 2013的自动矢量化模式,我对以下内容感到有些惊讶。考虑一下天真的代码:

static void rescale( double * __restrict out, unsigned short * __restrict in, size_t n, const double intercept, const double slope )
{
    for( size_t i = 0; i < n; ++i )
        out[i] = slope * in[i] + intercept;
}

Visual Studio通过以下方式返回了这个天真的例子失败:

--- Analyzing function: rescale
c:\users\malat\autovec\vec.c(18) : info C5012: loop not parallelized due to reason '1007'

编译行在哪里(我现在只对SSE2感兴趣):

cl vec.c /O2 /Qpar /Qpar-report:2

查看文档:

导致:

其中读作:

  

循环归纳变量或循环边界未签名32位   数字(int或long)。通过更改类型来解决此问题   诱导变量。

有没有办法重写这个循环,以便正确触发自动矢量化模式?

我没有使用一种简单的方法重写代码:

static void rescale( double * __restrict out, unsigned short * __restrict in, size_t n, const double intercept, const double slope )
{
  const long first = (long)n;
  const long secnd = n > LONG_MAX ? n - LONG_MAX : 0;
  for( long i = 0; i < first; ++i )
    out[i] = slope * in[i] + intercept;
  for( long i = 0; i < secnd; ++i )
    out[LONG_MAX+i] = slope * in[LONG_MAX+i] + intercept;
}

在上述情况下,Visual Studio现在报告:

--- Analyzing function: rescale
c:\users\malat\autovec\vec.c(21) : info C5012: loop not parallelized due to reason '1000'
c:\users\malat\autovec\vec.c(23) : info C5012: loop not parallelized due to reason '1000'

这意味着:

  

编译器在循环体中检测到数据依赖性。

在第二种情况下,我看不出哪里会有数据依赖。

我应该如何重写初始代码以取悦Visual Studio 2013的自动矢量化模式?

1 个答案:

答案 0 :(得分:1)

SSE2及其前身SSE都没有正确的指令将CREATE TRIGGER `trigger1` BEFORE INSERT ON `COMPANY` FOR EACH ROW IF NEW.DOKUMENTTYP LIKE 'test' AND NEW.STATUS LIKE 'neu' THEN INSERT INTO my_tools.testimport( processname, version, step, insstring, initiator ) VALUES ( 'COMPANY_ER', 0, 1, CONCAT( 'DWDOCID=', NEW.DWDOCID ) , 'robot' ); END IF; - s转换为uint16_t - s。

double转换为in