template <typename src_T, typename dst_T>
void convert(const src_T *src, dst_T *dst, int64_t n) {
-#pragma unroll
+#ifndef _MSC_VER
+# pragma unroll
+#endif
for (int64_t i = 0; i < n; i++) {
*dst = static_cast<dst_T>(
static_cast<at::native::inter_copy_type_t<dst_T>>(*src));
void convert(const int32_t *src, float *dst, int64_t n) {
int64_t i;
// int32_t and float have same size
-#pragma unroll
+#ifndef _MSC_VER
+# pragma unroll
+#endif
for (i = 0; i <= (n - Vec256<int32_t>::size); i += Vec256<int32_t>::size) {
auto input_vec = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(src + i));
auto output_vec = _mm256_cvtepi32_ps(input_vec);
_mm256_storeu_ps(reinterpret_cast<float*>(dst + i), output_vec);
}
-#pragma unroll
+#ifndef _MSC_VER
+# pragma unroll
+#endif
for (; i < n; i++) {
dst[i] = static_cast<float>(src[i]);
}
void convert(const int32_t *src, double *dst, int64_t n) {
int64_t i;
// int32_t has half the size of double
-#pragma unroll
+#ifndef _MSC_VER
+# pragma unroll
+#endif
for (i = 0; i <= (n - Vec256<double>::size); i += Vec256<double>::size) {
auto input_128_vec = _mm_loadu_si128(reinterpret_cast<const __m128i*>(src + i));
auto output_vec = _mm256_cvtepi32_pd(input_128_vec);
_mm256_storeu_pd(reinterpret_cast<double*>(dst + i), output_vec);
}
-#pragma unroll
+#ifndef _MSC_VER
+# pragma unroll
+#endif
for (; i < n; i++) {
dst[i] = static_cast<double>(src[i]);
}
mask_scatter_add(const scalar_t *src, scalar_t* base_addr,
const int_same_size_t<scalar_t> *offsets,
const int_same_size_t<scalar_t> *mask, int64_t len) {
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t i = 0; i < len; i++) {
if (mask[i] & 0x01) {
base_addr[offsets[i]] += src[i];
auto i_sw_offset = i_nw_offset + iVec(inp_sH);
auto i_se_offset = i_sw_offset + iVec(inp_sW);
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t c = 0; c < C; ++c) {
auto inp_slice_C_ptr = inp_slice[c].data();
scalar_t gInp_corner_arr[Vec::size];
auto gx = Vec(0), gy = Vec(0);
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t c = 0; c < C; ++c) {
auto inp_slice_C_ptr = inp_slice[c].data();
auto gInp_slice_C_ptr = gInp_slice[c].data();
auto out_ptr = out_slice.data() + offset;
auto out_sC = out_slice.stride(0);
auto inp_slice_ptr = inp_slice.data();
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int c = 0; c < C; ++c, out_ptr += out_sC, inp_slice_ptr += inp_sC) {
// mask_gather zeros out the mask, so we need to make a copy
auto mask_copy = mask;
integer_t gInp_offset_arr[iVec::size];
i_gInp_offset.store(gInp_offset_arr);
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t c = 0; c < C; ++c) {
mask_scatter_add(gOut_slice[c].data() + offset, gInp_slice[c].data(),
gInp_offset_arr, mask_arr, len);
auto spatial_offset = 0;
auto i_offsets_delta = iVec(grid_sW * step);
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t h = 0; h < out_H; h++) {
auto grid_ptr_x = grid_ptr + h * grid_sH;
auto grid_ptr_y = grid_ptr_x + grid_sCoor;
auto i_offsets = iVec::arange(0, grid_sW);
- #pragma unroll
+ #ifndef _MSC_VER
+ # pragma unroll
+ #endif
for (int64_t w = 0; w < out_W; w += step) {
auto len = std::min(step, out_W - w);
if (len < step) {
include_directories(${ATEN_INCLUDE_DIR})
# C++11
-set(CMAKE_CXX_FLAGS "--std=c++11 ${CMAKE_CXX_FLAGS}")
+if (not MSVC)
+ set(CMAKE_CXX_FLAGS "--std=c++11 ${CMAKE_CXX_FLAGS}")
+endif()
add_executable(main main.cpp)
target_link_libraries(main ${ATEN_LIBRARIES})
#ifdef _OPENMP
-#ifndef _WIN32
-#define PRAGMA(P) _Pragma(#P)
+#ifdef _WIN32
+// MSVC doesn't support loop pragmas, but does support others. Create a new macro to account for those differences.
+#define PRAGMA_LOOP(P) // Noop
+#define PRAGMA(P) __pragma(P)
#else
-#define PRAGMA(P) __pragma(P)
+#define PRAGMA_LOOP(P) _Pragma(#P)
+#define PRAGMA(P) _Pragma(#P)
#endif
#include <omp.h>
TYPE2 *tp = THTensor_getStoragePtr(TENSOR2)->data<TYPE2>()+TENSOR2->storage_offset(); \
ptrdiff_t iter = 0; \
if(tp != (TYPE2*)rp) { \
- PRAGMA(ivdep) \
+ PRAGMA_LOOP(ivdep) \
PRAGMA( omp parallel for if (SIZE > OMP_THRESHOLD * 10) firstprivate(rp, tp)) \
for (iter = 0; iter < SIZE; iter++) { \
TYPE2 *TENSOR2##_data = tp+iter; \
CODE \
}\
} else {\
- PRAGMA(simd) \
+ PRAGMA_LOOP(simd) \
PRAGMA( omp parallel for if (SIZE > OMP_THRESHOLD * 10) firstprivate(rp, tp) ) \
for (iter = 0; iter < SIZE; iter++) {\
TYPE2* TENSOR2##_data = tp+iter;\
TYPE3 *srcp = THTensor_getStoragePtr(TENSOR3)->data<TYPE3>()+TENSOR3->storage_offset(); \
ptrdiff_t iter = 0;\
if(tp != (TYPE2*)rp) { \
- PRAGMA(ivdep) \
+ PRAGMA_LOOP(ivdep) \
PRAGMA( omp parallel for if (SIZE > OMP_THRESHOLD * 10) ) \
for (iter = 0; iter < SIZE; iter++) {\
TYPE1 *TENSOR1##_data = rp+iter;\
CODE \
} \
} else {\
- PRAGMA(simd) \
+ PRAGMA_LOOP(simd) \
PRAGMA( omp parallel for if (SIZE > OMP_THRESHOLD * 10) ) \
for (iter = 0; iter < SIZE; iter++) {\
TYPE1 *TENSOR1##_data = rp+iter;\
#ifdef _OPENMP
-#ifndef _WIN32
-#define PRAGMA(P) _Pragma(#P)
+#ifdef _WIN32
+// MSVC doesing support loop pragmas, but does support others. Create a new macro to account for those differences.
+#define PRAGMA_LOOP(P) // Noop
+#define PRAGMA(P) __pragma(P)
#else
-#define PRAGMA(P) __pragma(P)
+#define PRAGMA_LOOP(P) _Pragma(#P)
+#define PRAGMA(P) _Pragma(#P)
#endif
#define TH_TENSOR_APPLY_CONTIG(TYPE, TENSOR, CODE) \
using c10::make_intrusive;
using c10::weak_intrusive_ptr;
+#ifndef _MSC_VER
#pragma GCC diagnostic ignored "-Wpragmas"
#pragma GCC diagnostic ignored "-Wunknown-warning-option"
#pragma GCC diagnostic ignored "-Wself-move"
+#endif
namespace {
class SomeClass0Parameters : public intrusive_ptr_target {};
#include <utility>
#include <type_traits>
+#ifndef _MSC_VER
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow"
-
+#endif
#ifdef _MSC_VER
#define SKA_NOINLINE(...) __declspec(noinline) __VA_ARGS__
#else
} // end namespace ska
+#ifndef _MSC_VER
#pragma GCC diagnostic pop
+#endif
// We also have to disable -Wunknown-warning-option and -Wpragmas, because
// some other compilers don't know about -Wterminate or -Wexceptions and
// will show a warning about unknown warning options otherwise.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpragmas"
-#pragma GCC diagnostic ignored "-Wunknown-warning-option"
-#pragma GCC diagnostic ignored "-Wterminate"
-#pragma GCC diagnostic ignored "-Wexceptions"
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4297) // function assumed not to throw an exception but does
+#else
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wpragmas"
+# pragma GCC diagnostic ignored "-Wunknown-warning-option"
+# pragma GCC diagnostic ignored "-Wterminate"
+# pragma GCC diagnostic ignored "-Wexceptions"
+#endif
AT_ASSERTM(
refcount_.load() == 0,
"Tried to destruct an intrusive_ptr_target that still has intrusive_ptr to it");
AT_ASSERTM(
weakcount_.load() == 0,
"Tried to destruct an intrusive_ptr_target that still has weak_intrusive_ptr to it");
-#pragma GCC diagnostic pop
+#ifdef _MSC_VER
+# pragma warning(pop)
+#else
+# pragma GCC diagnostic pop
+#endif
}
constexpr intrusive_ptr_target() noexcept : refcount_(0), weakcount_(0) {}
// variable template. '-Wpragmas' and '-Wunknown-warning-option' has to be
// disabled for compilers that don't know '-Wundefined-var-template' and
// would error at our attempt to disable it.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wpragmas"
-#pragma GCC diagnostic ignored "-Wunknown-warning-option"
-#pragma GCC diagnostic ignored "-Wundefined-var-template"
+#ifndef _MSC_VER
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wpragmas"
+# pragma GCC diagnostic ignored "-Wunknown-warning-option"
+# pragma GCC diagnostic ignored "-Wundefined-var-template"
+#endif
return TypeMeta(_typeMetaDataInstance<T>());
-#pragma GCC diagnostic pop
+#ifndef _MSC_VER
+# pragma GCC diagnostic pop
+#endif
}
private:
# Set standard properties on the target
torch_set_target_props(caffe2)
-if (MSVC)
-target_compile_options(caffe2 INTERFACE "-std=c++11")
-else()
-target_compile_options(caffe2 INTERFACE "$<$<COMPILE_LANGUAGE:CXX>:-std=c++11>")
+if (NOT MSVC)
+ target_compile_options(caffe2 INTERFACE "$<$<COMPILE_LANGUAGE:CXX>:-std=c++11>")
endif()
target_compile_options(caffe2 PRIVATE "-DCAFFE2_BUILD_MAIN_LIB")
#define CAFFE2_NORETURN __attribute__((noreturn))
#endif
-#if defined(_MSC_VER)
+#if (defined _MSC_VER && !defined NOMINMAX)
#define NOMINMAX
#endif