为什么AVX-512而不是AVX2上的这种矢量化失败?

时间:2017-05-19 11:23:33

标签: c++ parallel-processing vectorization avx2 avx512

我有我在AVX2机器上测试的代码:

#pragma omp simd

正如英特尔顾问所建议的那样,我添加了icpc来强制进行矢量化,因为编译器(-xCORE-AVX2 2017更新3)假设不存在依赖关系。在我的AVX2机器上,这不会产生任何错误,并且实际上可以提高性能。

然而,在AVX-512机器上(具有相同的编译器和版本),这会产生分段错误。为什么会这样?

编译标志是相同的,期望一个使用-xMIC-AVX512而另一个INTEL_OPT=-O3 -ipo -simd -xCORE-AVX2 -parallel -qopenmp -fargument-noalias -ansi-alias -no-prec-div -fp-model fast=2 -fma -align -finline-functions INTEL_PROFILE=-g -qopt-report=5 -Bdynamic -shared-intel -debug inline-debug-info -qopenmp-link dynamic -parallel-source-info=2 -ldl 。这是完整的编译标志集:

func getLastPriceForFromBtceForPair()->(ethLast:String,btcLast:String){

    var btcUSDLast = ""
    var ethUSDLast = ""

    let APIURL = "https://btc-e.com/api/3/ticker/btc_usd)"
    let APIURL2 = "https://btc-e.com/api/3/ticker/eth_usd)"

    Alamofire.request(APIURL).responseData { (resData) in

        let prices = JSON(data: resData.result.value!)


        if let pairGeneral = prices["btc_usd"].dictionaryObject {

            if let pairLast = pairGeneral["last"] as? Double{

                    btcUSDLast = String(pairLast)

          //If I print here I can see the data.

            }

        }

    }


    Alamofire.request(APIURL2).responseData { (resData2) in

        let prices2 = JSON(data: resData2.result.value!)


        if let pairGeneralETH = prices2["eth_usd"].dictionaryObject {

            if let pairLastETH = pairGeneralETH["last"] as? Double{

                ethUSDLast = String(pairLastETH)

          //If I print here I can see the data.

            }

        }

    }

    return (btcUSDLast,ethUSDLast)
}

0 个答案:

没有答案