+1
In particular, folks, if I am misinterpreting/misunderstanding your concerns, please correct me!
+1
You have just proposed a much needed update to this section of the Vector dialect on “Hardware Vector Ops” vs “Virtual Vector Ops” (that document has served us very well, but is a bit out-dated):
As in, we should use the taxonomy that you proposed to update that document.
This is precisely what I had in mind, but takes things much further. Thank you for sharing!
TBH, I’m a bit concerned about introducing a new Vector Op - this feels like vector.extractelement
/vector.insertelement
, and we should be mindful of:
Perhaps we can avoid that? See below.
No Let me clarify (by special-casing my example):
Allow:
// 1. %src + %dst are the _indexed_ inputs and can be 0-D
// 2. if (numIndices == srcRank) --> result is _always_ f32
// 3. The restriction only applies to the non-indexed argument.
%0 = vector.extract %src[] : f32 from vector<f32>
%1 = vector.insert %v, %dst[] : f32 into vector<f32>
Disallow:
// 1. %src + %dst are the _indexed_ inputs that can be 0-D
// 2. if (numIndices == srcRank) --> result is f32 _or_ vector<f32>
// 3. No restriction on the non-index arguments.
%0 = vector.extract %src[] : vector<f32> from vector<f32>
%1 = vector.insert %v, %dst[] : vector<f32> into vector<f32>
The ambiguity is caused by the fact that, when numIndices == srcRank
, the non-indexed argument could either be f32
or vector<f32>
. We need to restrict that. I proposed f32
, you are suggesting vector<f32>
. Whichever one we pick, we should stick to it consistently.
Put differently, I am still hoping that we can re-use vector.insert
/vector.extract
. If we discover otherwise, then we can just introduce vector.extract_scalar
as you proposed.
Btw, I find the split into the “indexed” and “non-indexed” arguments very helpful. To me, we have always been missing that when reasoning about “read”/“write” operations. We should incorporate that into your taxonomy.
Hm, if Category 1 allows 0-D vectors and Category 2 does not allow 0-D vectors, shouldn’t this statement be reversed?
An operation defined as Category 3 can be used as a Category 2 or Category 1 operation, but the other way around is not true.
As in, Category 3 is the strictest and hence these Ops are also valid Category 2 and 1 Ops? Or:
- Bucket 1 = Category 1 + Category 2 + Category 3
- Bucket 2 = Category 2 + Category 3
- Bucket 3 = Category 3
Also, @Groverkss, thanks again for all your effort going into improving this
-Andrzej