Winforms 错误C3645:\ clrcall不能用于编译为本机代码的函数
我试图在VS2010的Windows窗体应用程序中使用SSE指令。在下面的链接中,我使用了sum_array的函数 但是当我编译应用程序时,它给出了以下错误Winforms 错误C3645:\ clrcall不能用于编译为本机代码的函数,winforms,visual-studio-2010,visual-c++,sse,Winforms,Visual Studio 2010,Visual C++,Sse,我试图在VS2010的Windows窗体应用程序中使用SSE指令。在下面的链接中,我使用了sum_array的函数 但是当我编译应用程序时,它给出了以下错误 error C3645: 'plot_rectangle::Form1::sum_array' : __clrcall cannot be used on functions compiled to native code 由于我还在应用程序中使用OpenCV函数,因此我必须为此选择/clr编译器选项 那么,当我们将SSE与OpenC
error C3645: 'plot_rectangle::Form1::sum_array' : __clrcall cannot be used on functions compiled to native code
由于我还在应用程序中使用OpenCV函数,因此我必须为此选择/clr编译器选项
那么,当我们将SSE与OpenCV一起使用时,该错误的解决方案是什么呢
我也尝试过在pragma-like之间使用SSE指令
#pragma managed(push, off)
uint32_t sum_array(const uint8_t a[], int n)
{
const __m128i vk0 = _mm_set1_epi8(0); // constant vector of all 0s for use with _mm_unpacklo_epi8/_mm_unpackhi_epi8
const __m128i vk1 = _mm_set1_epi16(1); // constant vector of all 1s for use with _mm_madd_epi16
__m128i vsum = _mm_set1_epi32(0); // initialise vector of four partial 32 bit sums
uint32_t sum;
int i;
for (i = 0; i < n; i += 16)
{
__m128i v = _mm_load_si128((const __m128i *)&a[i]); // load vector of 8 bit values
__m128i vl = _mm_unpacklo_epi8(v, vk0); // unpack to two vectors of 16 bit values
__m128i vh = _mm_unpackhi_epi8(v, vk0);
vsum = _mm_add_epi32(vsum, _mm_madd_epi16(vl, vk1));
vsum = _mm_add_epi32(vsum, _mm_madd_epi16(vh, vk1));
// unpack and accumulate 16 bit values to
// 32 bit partial sum vector
}
// horizontal add of four 32 bit partial sums and return result
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 8));
vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4));
sum = _mm_cvtsi128_si32(vsum);
return sum;
}
#pragma managed(pop)
#pragma管理(推、关)
uint32求和数组(常量uint8求和[],整数n)
{
const _m128i vk0=_mm_set1_epi8(0);//与_mm_unpaclo_epi8/_mm_unpachi_epi8一起使用的所有0的常量向量
const _m128i vk1=_mm_set1_epi16(1);//与_mm_madd_epi16一起使用的所有1的常量向量
__m128i vsum=_mm_set1_epi32(0);//初始化四个部分32位和的向量
uint32_t sum;
int i;
对于(i=0;i
但同样的错误
任何人都可以帮我解决这个问题。在编译成IL的代码中不能使用内联汇编或SSE intrinsic。解决方法很简单,将其写入一个单独的helper函数中,并用#pragma managed括起来,如下所示:
#pragma managed(push, off)
void func foo(args...)
{
// It's fine here
//...
}
#pragma managed(pop)
然后从Form1::sum_array()方法调用该函数。谢谢您的回复。我还尝试了在pragma之间使用SSE代码。我还粘贴了我正在做的代码。但是得到了同样的错误。当我在包含正确的头之后尝试它时,编译很好。应该如此。您不能得到相同的错误,您肯定会得到不同的错误。谢谢您的回复。您是对的,在名称空间中声明pragma也显示了与pragma相关的错误。因此,现在它正在发挥作用。