我有我在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)
}