我正在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的自动矢量化模式?
答案 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
。