- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi all,
I have vectorization problems and I really need your help.
Here are the vectorization reports for each array notation in the code bellow:
-Array Notation(1) : Vectorized
-Array Notation(2) : Subscript too complex
-Array Notation(3) : Existence of vector dependence
-Array Notation(4) : Subscript too complex
-Array Notatino(5) : Subscript too complex
-Array Notation(6) : Existence of vector dependence
I tried using "restrict" on the pointers(i.e. int* restric p_p_data_), but didn't work.
Is there any problem I'm missing?
Thanks in advance!
[CPU Info]
-Core2 Quad Q9400
[OS Info]
-WinXP Pro SP3
[Compiler Info]
-Composer XE 2011 Update7, Package ID:w_ccompxe_2011.7.258
[cpp]class SomeClass {
SomeClass();
~SomeClass();
void Init();
void PreProcess();
void Process();
__declspec (vector) int GetDiff(int sub, int add) {
return (add - sub);
};
const byte* add_point_;
const byte* subtract_point_;
std::vector y_data_;
std::vector x_data_;
std::vector processed_data_;
int* p_y_data_;
int* p_x_data_;
int* p_p_data_;
};
void Init() {
x_data_.resize(5000);
y_data_.resize(5000);
processed_data_.resize(5000);
p_x_data_ = &x_data_.front();
p_y_data_ = &y_data_.front();
p_p_data_ = &processed_data_.front();
return;
}
void PreProcess() {
int x_size = 5000;
add_point_ = image_->base_address();
subtract_point_ = add_point_;
// Array Notation(1)
p_y_data_[0:x_size] = add_point_[0:x_size];
for (int y = 0; y < 4; y++) {
// Array Notation(2)
p_y_data_[0:x_size] += add_point_[0:x_size];
}
return;
}
void Process() {
int x_size = 5000;
// Array Notation(3)
p_y_data_[0:x_size] += GetDiff(subtract_point_[0:x_size], add_point_[0:x_size]);
// Array Notation(4)
p_x_data_[0:x_size] = p_y_data_[0:x_size];
x_size--;
for (int x = 1; x < 4; x++) {
// Array Notation(5)
p_x_data_[0:x_size] += p_y_data_;
x_size--;
}
x_size -= 4;
// Array Notation(6)
p_p_data_[0:x_size] = GetDiff(p_x_data_[0:x_size], p_x_data_[settings_->df.block_width:x_size]);
return;
}[/cpp]
1 Solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
ansi-alias is needed so as to assert that the (non-integer) data contained in a doesn't alias with the book-keeping data. I suppose it would be particularly inadvisable to expect a compiler to accept code which violates the standard in such a case, but Windows applications do frequently have such expectations.
restrict would be used to assert non-aliasing among data regions defined separately outside the local scope and accessed by pointers (C style); by extension, it might apply to reference. As restrict still is not formally defined for C++, you are correct that it may not necessarily be meaningful in class context.
restrict would be used to assert non-aliasing among data regions defined separately outside the local scope and accessed by pointers (C style); by extension, it might apply to reference. As restrict still is not formally defined for C++, you are correct that it may not necessarily be meaningful in class context.
Link Copied
6 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
What compiler are you use?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your compiler options would need to include -ansi-alias -restrict , and you have left your restrict out of your source code (restrict or __restrict may work, but not __restrict__ with the relatively old compiler). It's hard to guess what you have done; an actual example with your compile command would go a long way. If you are depending on the new gcc compatibility, that is an option for ICL 13.0.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Maycon Oliveira!
Thank you for your reply.
I'm using intel composer xe on Visual Studio 2005.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Timp!
Thank you for your reply.
Vectocization worked with "Qansi-alias" compiler option.
But, I thought that the "restrict" qualifier and the "Qrestrict" compiler option were enough to remove the vector dependency of pointers.
Using "Qansi-alias" I have to worry about pointers aliasing on other part of the total source code...
I also tried "restrict" instead of "__restrict" but didn't work.
Maybe, "restict" shouldn't be used on members of a class?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
ansi-alias is needed so as to assert that the (non-integer) data contained in a doesn't alias with the book-keeping data. I suppose it would be particularly inadvisable to expect a compiler to accept code which violates the standard in such a case, but Windows applications do frequently have such expectations.
restrict would be used to assert non-aliasing among data regions defined separately outside the local scope and accessed by pointers (C style); by extension, it might apply to reference. As restrict still is not formally defined for C++, you are correct that it may not necessarily be meaningful in class context.
restrict would be used to assert non-aliasing among data regions defined separately outside the local scope and accessed by pointers (C style); by extension, it might apply to reference. As restrict still is not formally defined for C++, you are correct that it may not necessarily be meaningful in class context.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Declaring restrict pointers inside my function worked and finally vectorization sucessed!
Thank you so much for your help!!!
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page