mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-02 02:32:27 +00:00
Add OpenMP support
This commit is contained in:
parent
c1e18e7903
commit
5f8e9f14c1
742 changed files with 94643 additions and 1279 deletions
55
third_party/openmp/kmp_utils.h
vendored
Normal file
55
third_party/openmp/kmp_utils.h
vendored
Normal file
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
* kmp_utils.h -- Utilities that used internally
|
||||
*/
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#ifndef __KMP_UTILS_H__
|
||||
#define __KMP_UTILS_H__
|
||||
|
||||
#include <cstddef>
|
||||
|
||||
#include "kmp.h"
|
||||
|
||||
/// A simple pure header implementation of VLA that aims to replace uses of
|
||||
/// actual VLA, which can cause compile warning. This class by default creates a
|
||||
/// stack buffer that can accomodate \p N elements. If the number of elements is
|
||||
/// greater than \p N, then a heap buffer will be allocated and used to
|
||||
/// accomodate the elements. Similar to the actual VLA, we don't check boundary
|
||||
/// (for now), so we will not store the number of elements. We can always revise
|
||||
/// it later.
|
||||
template <typename T, unsigned N = 8> class SimpleVLA final {
|
||||
T StackBuffer[N];
|
||||
T *HeapBuffer = nullptr;
|
||||
T *Ptr = StackBuffer;
|
||||
|
||||
public:
|
||||
SimpleVLA() = delete;
|
||||
SimpleVLA(const SimpleVLA &) = delete;
|
||||
SimpleVLA(SimpleVLA &&) = delete;
|
||||
SimpleVLA &operator=(const SimpleVLA &) = delete;
|
||||
SimpleVLA &operator=(SimpleVLA &&) = delete;
|
||||
|
||||
explicit SimpleVLA(unsigned NumOfElements) noexcept {
|
||||
if (NumOfElements > N) {
|
||||
HeapBuffer =
|
||||
reinterpret_cast<T *>(__kmp_allocate(NumOfElements * sizeof(T)));
|
||||
Ptr = HeapBuffer;
|
||||
}
|
||||
}
|
||||
|
||||
~SimpleVLA() {
|
||||
if (HeapBuffer)
|
||||
__kmp_free(HeapBuffer);
|
||||
}
|
||||
|
||||
operator T *() noexcept { return Ptr; }
|
||||
operator const T *() const noexcept { return Ptr; }
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue