You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
64 lines
2.1 KiB
/*
|
|
* This is component of StoRM - Cuda Plugin to check whether type alignment matches the assumptions done while optimizing the code.
|
|
*/
|
|
#include <cstdint>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#define CONTAINER_SIZE 100ul
|
|
|
|
template <typename IndexType, typename ValueType>
|
|
int checkForAlignmentOfPairTypes(size_t containerSize, IndexType const firstValue, ValueType const secondValue) {
|
|
std::vector<std::pair<IndexType, ValueType>>* myVector = new std::vector<std::pair<IndexType, ValueType>>();
|
|
for (size_t i = 0; i < containerSize; ++i) {
|
|
myVector->push_back(std::make_pair(firstValue, secondValue));
|
|
}
|
|
size_t myVectorSize = myVector->size();
|
|
IndexType* firstStart = &(myVector->at(0).first);
|
|
IndexType* firstEnd = &(myVector->at(myVectorSize - 1).first);
|
|
ValueType* secondStart = &(myVector->at(0).second);
|
|
ValueType* secondEnd = &(myVector->at(myVectorSize - 1).second);
|
|
size_t startOffset = reinterpret_cast<size_t>(secondStart) - reinterpret_cast<size_t>(firstStart);
|
|
size_t endOffset = reinterpret_cast<size_t>(secondEnd) - reinterpret_cast<size_t>(firstEnd);
|
|
size_t firstOffset = reinterpret_cast<size_t>(firstEnd) - reinterpret_cast<size_t>(firstStart);
|
|
size_t secondOffset = reinterpret_cast<size_t>(secondEnd) - reinterpret_cast<size_t>(secondStart);
|
|
|
|
delete myVector;
|
|
myVector = nullptr;
|
|
|
|
if (myVectorSize != containerSize) {
|
|
return -2;
|
|
}
|
|
|
|
// Check for alignment:
|
|
// Requirement is that the pairs are aligned like: first, second, first, second, first, second, ...
|
|
if (sizeof(IndexType) != sizeof(ValueType)) {
|
|
return -3;
|
|
}
|
|
if (startOffset != sizeof(IndexType)) {
|
|
return -4;
|
|
}
|
|
if (endOffset != sizeof(IndexType)) {
|
|
return -5;
|
|
}
|
|
if (firstOffset != ((sizeof(IndexType) + sizeof(ValueType)) * (myVectorSize - 1))) {
|
|
return -6;
|
|
}
|
|
if (secondOffset != ((sizeof(IndexType) + sizeof(ValueType)) * (myVectorSize - 1))) {
|
|
return -7;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int main(int argc, char* argv[]) {
|
|
int result = 0;
|
|
|
|
result = checkForAlignmentOfPairTypes<uint_fast64_t, double>(CONTAINER_SIZE, 42, 3.14);
|
|
if (result != 0) {
|
|
return result;
|
|
}
|
|
|
|
return 0;
|
|
}
|