2012-11-29 34 views
3

我尝试编译由intel提供的使用SSE2的随机数生成器函数。 如果我尝试编译下面的代码:如何在Linux上使用gcc编译intel rand_sse?

///////////////////////////////////////////////////////////////////////////// 
// The Software is provided "AS IS" and possibly with faults. 
// Intel disclaims any and all warranties and guarantees, express, implied or 
// otherwise, arising, with respect to the software delivered hereunder, 
// including but not limited to the warranty of merchantability, the warranty 
// of fitness for a particular purpose, and any warranty of non-infringement 
// of the intellectual property rights of any third party. 
// Intel neither assumes nor authorizes any person to assume for it any other 
// liability. Customer will use the software at its own risk. Intel will not 
// be liable to customer for any direct or indirect damages incurred in using 
// the software. In no event will Intel be liable for loss of profits, loss of 
// use, loss of data, business interruption, nor for punitive, incidental, 
// consequential, or special damages of any kind, even if advised of 
// the possibility of such damages. 
// 
// Copyright (c) 2003 Intel Corporation 
// 
// Third-party brands and names are the property of their respective owners 
// 
/////////////////////////////////////////////////////////////////////////// 
// Random Number Generation for SSE/SSE2 
// Source File 
// Version 0.1 
// Author Kipp Owens, Rajiv Parikh 
//////////////////////////////////////////////////////////////////////// 



#ifndef RAND_SSE_H 
#define RAND_SSE_H 
#include "emmintrin.h" 
#include <time.h> 

//#define COMPATABILITY 
//define this if you wish to return values similar to the standard rand(); 


void srand_sse(unsigned int seed); 
void rand_sse(unsigned int*); 

__declspec(align(16)) static __m128i cur_seed; 

void srand_sse(unsigned int seed) { 
    cur_seed = _mm_set_epi32(seed, seed+1, seed, seed+1); 
} 

inline void rand_sse(unsigned int* result) { 
    __declspec(align(16)) __m128i cur_seed_split; 
    __declspec(align(16)) __m128i multiplier; 
    __declspec(align(16)) __m128i adder; 
    __declspec(align(16)) __m128i mod_mask; 
    __declspec(align(16)) __m128i sra_mask; 
    __declspec(align(16)) __m128i sseresult; 
    __declspec(align(16)) static const unsigned int mult[4] = { 214013, 17405, 214013, 69069 }; 
    __declspec(align(16)) static const unsigned int gadd[4] = { 2531011, 10395331, 13737667, 1 }; 
    __declspec(align(16)) static const unsigned int mask[4] = { 0xFFFFFFFF, 0, 0xFFFFFFFF, 0 }; 
    __declspec(align(16)) static const unsigned int masklo[4] = { 0x00007FFF, 0x00007FFF, 0x00007FFF, 0x00007FFF }; 

    adder = _mm_load_si128((__m128i*) gadd); 
    multiplier = _mm_load_si128((__m128i*) mult); 
    mod_mask = _mm_load_si128((__m128i*) mask); 
    sra_mask = _mm_load_si128((__m128i*) masklo); 
    cur_seed_split = _mm_shuffle_epi32(cur_seed, _MM_SHUFFLE(2, 3, 0, 1)); 

    cur_seed = _mm_mul_epu32(cur_seed, multiplier); 
    multiplier = _mm_shuffle_epi32(multiplier, _MM_SHUFFLE(2, 3, 0, 1)); 
    cur_seed_split = _mm_mul_epu32(cur_seed_split, multiplier); 

    cur_seed = _mm_and_si128(cur_seed, mod_mask); 
    cur_seed_split = _mm_and_si128(cur_seed_split, mod_mask); 
    cur_seed_split = _mm_shuffle_epi32(cur_seed_split, _MM_SHUFFLE(2, 3, 0, 1)); 
    cur_seed = _mm_or_si128(cur_seed, cur_seed_split); 
    cur_seed = _mm_add_epi32(cur_seed, adder); 

    #ifdef COMPATABILITY 

    // Add the lines below if you wish to reduce your results to 16-bit vals... 
    sseresult = _mm_srai_epi32(cur_seed, 16); 
    sseresult = _mm_and_si128(sseresult, sra_mask); 
    _mm_storeu_si128((__m128i*) result, sseresult); 
    return; 

    #endif 

    _mm_storeu_si128((__m128i*) result, cur_seed); 
    return; 
} 

#endif 

int main() { 
    srand_see(time(0)); 

    return 0; 
} 

我得到的错误:

rand_sse.cpp:40:11: error: expected constructor, destructor, or type conversion before ‘(’ token 
rand_sse.cpp: In function ‘void srand_sse(unsigned int)’: 
rand_sse.cpp:43:5: error: ‘cur_seed’ was not declared in this scope 
rand_sse.cpp: In function ‘void rand_sse(unsigned int*)’: 
rand_sse.cpp:47:25: error: ‘align’ was not declared in this scope 
rand_sse.cpp:47:27: error: ‘__declspec’ was not declared in this scope 
rand_sse.cpp:47:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:48:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:49:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:50:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:51:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:52:29: error: expected ‘;’ before ‘__m128i’ 
rand_sse.cpp:53:29: error: expected ‘;’ before ‘static’ 
rand_sse.cpp:54:29: error: expected ‘;’ before ‘static’ 
rand_sse.cpp:55:29: error: expected ‘;’ before ‘static’ 
rand_sse.cpp:56:29: error: expected ‘;’ before ‘static’ 
rand_sse.cpp:58:5: error: ‘adder’ was not declared in this scope 
rand_sse.cpp:58:40: error: ‘gadd’ was not declared in this scope 
rand_sse.cpp:59:5: error: ‘multiplier’ was not declared in this scope 
rand_sse.cpp:59:45: error: ‘mult’ was not declared in this scope 
rand_sse.cpp:60:5: error: ‘mod_mask’ was not declared in this scope 
rand_sse.cpp:60:43: error: ‘mask’ was not declared in this scope 
rand_sse.cpp:61:5: error: ‘sra_mask’ was not declared in this scope 
rand_sse.cpp:61:43: error: ‘masklo’ was not declared in this scope 
rand_sse.cpp:62:5: error: ‘cur_seed_split’ was not declared in this scope 
rand_sse.cpp:62:41: error: ‘cur_seed’ was not declared in this scope 

的代码摘自:Intel 它是在Ubuntu 64位编译和GCC 4.6.3与以下命令:

g++ rand_sse.cpp -O2 -march=core2 -msse2 -o rand_sse 

我在想什么?任何关于我做错的建议都会非常有帮助。谢谢!

回答

9

只需删除__declspec (align(16))部件即可。类型__m128等已经声明与正确的对齐。

PS。好的,也有一些阵列,GCC的做法是__attribute__ ((aligned(16)))

没有对齐属性,它会正常工作,但效率会降低。

+0

谢谢!编译__attribute__ ..抱歉不能upvote你..需要更多的声誉:) – dlb

相关问题