정수 계산을 병렬 처리하기 위해 HW를 사용하려면 Vector을 실험 해 왔습니다. 벡터 작업으로 오버플로 검사를 사용할 수있는 방법이 있습니까?벡터로 체크 된 산술을 할 수 있습니까? <T>
예를 들어 int의 두 열 (길이가 동일한 배열)을 함께 추가하는 것입니다. 여기 c=a+b
는 c[0] = a[0] + b[0]
, c[1] = a[1] + b[1]
, 의미 등
나는 이런 식으로 뭔가를 할 수있는 가정 :
overflow[i] = b[i] >= 0 ? c[i] < a[i] : c[i] >= a[i];
그러나이 닷넷의 자동 오버 플로우 검사보다 더 느려질 수 있습니다 (분기) 및 성능 이점을 부정 할 수 Vector<T>
을 사용 중입니다.
우리는 가장 일반적으로 사용되는 연산 인 승산, 빼기, 더 작은 정도의 정수 나누기를 최적화하려고합니다.
편집 : 이것에 대해 조금 더 생각해 보았습니다. 확인되지 않은 벡터 추가보다 2.5 배 느립니다. 추가적인 오버 헤드가 많은 것 같습니다.
public Vector<int> Calc(Vector<int> a, Vector<int> b)
{
var result = a + b;
var overflowFlag = Vector.GreaterThan(b, Vector<int>.Zero) * Vector.LessThan(result,a)
+ Vector.LessThan(b,Vector<int>.Zero) * Vector.GreaterThan(result, a);
// It makes no sense to add the flags to the result, but haven't decided what to do with them yet,
// and don't want the compiler to optimise the overflow calculation away
return result + overflowFlag;
}
타이밍 :
- 일반 추가 (100,000 배열 한 쌍의 추가 4K 반복) : 618ms
- 일반 검사 추가 : 1092ms
- 벡터 추가 : 208ms
- 벡터 검사 추가 : 536ms
아니요. 물론 직접 확인할 수도 있습니다. 더 많은 맥락에서 나는 좀 더 타겟 된 추천을 줄 수 있었다. – harold
@Harold - 좀 더 자세한 내용을 추가했습니다. 오버플로가 발생했는지 여부를 결정하는 효율적인 방법이 있습니까? – Rob
분기 할 필요는 없지만 실제로는 할 수 없습니다. ConditionalSelect를 사용할 수 있습니다. 곱셈은 확대되지 않고 까다 롭고 넓어지는 것은 성가신 일입니다. 나는 그것에 대해 생각할 것입니다. 나중에 제대로 대답하기 위해 다시 돌아올 것입니다. – harold