这是我第一次使用SSE内在函数.我试图将一段简单的代码转换为使用英特尔SSE内在的更快的版本(直到SSE4.2).我好像遇到了一些错误.
代码的标量版本是:(简单矩阵乘法)
void mm(int n, double *A, double *B, double *C)
{
int i,j,k;
double tmp;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
tmp = 0.0;
for(k = 0; k < n; k++)
tmp += A[n*i+k] *
B[n*k+j];
C[n*i+j] = tmp;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的版本:我已经包含了 #include <ia32intrin.h>
void mm_sse(int n, double *A, double *B, double *C)
{
int i,j,k;
double tmp;
__m128d a_i, b_i, c_i;
for(i = 0; i < n; i++)
for(j …Run Code Online (Sandbox Code Playgroud) 我试图在一段代码上实现SSE向量化,我需要将我的1D数组与16字节内存对齐.但是,我已经尝试了几种方法来分配16字节内存对齐数据,但它最终是4字节内存对齐.
我必须使用Intel icc编译器.这是我正在测试的示例代码:
#include <stdio.h>
#include <stdlib.h>
void error(char *str)
{
printf("Error:%s\n",str);
exit(-1);
}
int main()
{
int i;
//float *A=NULL;
float *A = (float*) memalign(16,20*sizeof(float));
//align
// if (posix_memalign((void **)&A, 16, 20*sizeof(void*)) != 0)
// error("Cannot align");
for(i = 0; i < 20; i++)
printf("&A[%d] = %p\n",i,&A[i]);
free(A);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
&A[0] = 0x11fe010
&A[1] = 0x11fe014
&A[2] = 0x11fe018
&A[3] = 0x11fe01c
&A[4] = 0x11fe020
&A[5] = 0x11fe024
&A[6] = 0x11fe028
&A[7] = 0x11fe02c
&A[8] = 0x11fe030 …Run Code Online (Sandbox Code Playgroud) 我一直在努力使用某个特定的应用程序,我已经尝试了一切.从自动向量化到手动编码的SSE内在函数.但不知何故,我无法在基于模板的应用程序上获得加速.
以下是我当前代码的片段,我使用SSE内在函数进行了矢量化.当我使用-vec-report3编译(Intel icc)时,我不断获取此消息:
remark:loop未向量化:语句无法向量化.
#pragma ivdep
for ( i = STENCIL; i < z - STENCIL; i+=4 )
{
it = it2 + i;
__m128 tmp2i = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k])),X4_i); //loop was not vectorized: statement cannot be vectorized
__m128 tmp3 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k])),X3_i);
__m128 tmp4 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k])),X2_i);
__m128 tmp5 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j +k*it_k])),X1_i);
__m128 tmp6 = _mm_add_ps(_mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)), _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i));
_mm_store_ps(&tmp2[i],tmp6);
}
Run Code Online (Sandbox Code Playgroud)
我错过了一些关键的东西吗 由于该消息没有说明为什么它不能被矢量化,我发现很难确定瓶颈.
更新: 仔细考虑了建议后,我按照以下方式调整了代码.我认为最好将其进一步分解,以确定实际上导致向量依赖性的语句.
//#pragma ivdep
for ( i = STENCIL; i < z - STENCIL; i+=4 )
{
it = it2 + …Run Code Online (Sandbox Code Playgroud) 我第一次使用SSE内在函数,即使在确保16byte内存对齐后,我也遇到了分段错误.这篇文章是我之前问题的扩展:
这是我声明我的数组的方式:
float *V = (float*) memalign(16,dx*sizeof(float));
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时:
__m128 v_i = _mm_load_ps(&V[i]); //It works
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时:
__m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault
Run Code Online (Sandbox Code Playgroud)
但如果我这样做:
__m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again
Run Code Online (Sandbox Code Playgroud)
但是我想要消除使用_mm_loadu_ps并希望_mm_load_ps仅使用它.
我正在使用Intel icc编译器.
我该如何解决这个问题?
更新:
使用以下代码中的两个操作:
void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float c3, float c4)
{
int i, j, k;
for (i = 4; i < dx-4; i++)
{
U[i] = (c0 * (V[i]) …Run Code Online (Sandbox Code Playgroud) 我有一个有趣的问题,过去两天我一直在努力解决这个问题.我试图在C中编写一个程序,它接受以下输入数组:
1,1,5,5,
1,1,5,9,
2,2,6,2,
1,2,5,5,
1,3,6,6,
1,4,5,1,
4,1,5,6,
5,2,7,1,
1,1,6,0,
2,2,5,0,
Run Code Online (Sandbox Code Playgroud)
step1:根据第3列对上面的数组进行分组(基于第3列的值,对4个元素(即每行)的元组进行桶排序:
2,2,5,5
1,1,5,9,
1,2,5,5,
1,4,5,1,
4,1,5,6,
2,2,5,0,
2,2,6,2,
1,3,6,6,
1,1,6,0,
5,2,7,1
Run Code Online (Sandbox Code Playgroud)
第2步:最后根据每个桶中的第4列对元素进行排序,如下所示:
最终输出数组:
2,2,5,0,
1,4,5,1,
2,2,5,5,
1,2,5,5,
4,1,5,6,
1,1,5,9,
1,1,6,0,
2,2,6,2,
1,3,6,6,
5,2,7,1
Run Code Online (Sandbox Code Playgroud)
第1列和第2列中的元素在上述排序过程中不起任何作用.
我尝试了各种技术,使用快速排序或桶排序,然后是后续的快速排序.没有什么事情做得很好.任何人都可以建议使用适当的数据结构在C中执行此操作的方法.
获取以下代码的分段错误.请指教.
struct columns {
char* c_name;
char* c_type;
char* c_size;
};
int main(int argc, char* argv[])
{
int column_num = 3;
struct columns col[10];
//columns *col = (columns*) malloc (sizeof(columns) * column_num);
strcpy(col[0].c_name, "PSID");
strcpy(col[0].c_type, "INT");
strcpy(col[0].c_size, "4");
}
Run Code Online (Sandbox Code Playgroud)
我使用2种方法为列结构分配空间,但继续得到分段错误.我错过了什么吗?
我的代码生成一个C数组结构,其中struct的一个成员是STL std :: unordered_map:
typedef struct test_s {
int count_a;
std::unordered_map<std::string, int> my_map;
} test_map;
typedef struct cm_example {
int width;
test_map *counts;
unsigned int hasha, hashb;
} cm_sketch;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试访问地图以执行查找,插入等时,我总是遇到浮点异常:
Compile: g++ -std=c++11 -g test_struct.cpp -o h_str
Run: ./h_str_str agggcctttgagag 100
Output:
Kmer name: agggcctttgagag
hash_a: 172110908 , hash_b: 1954003865, bucket: 92
Floating point exception
Run Code Online (Sandbox Code Playgroud)
我的代码如下:
cm_sketch *cm_init (int width, int seed)
{
cm_sketch *cm;
int i=0;
cm = (cm_sketch *) malloc(sizeof(cm_sketch));
cm->width = width;
cm->counts = (test_map *) malloc …Run Code Online (Sandbox Code Playgroud)