小编a3m*_*ord的帖子

数组的比较(逐个元素)

我正在使用的算法花费了大部分时间将一个数组与一行矩阵进行比较.如果任何第i个元素相同,则算法调用过程A,如果没有元素相等,则调用过程B. 例如:

[1, 4, 10, 3, 5]并且[5, 3, 0, 3, 0]调用A()因为对于第4个位置,两个数组中的值都是3.

[1, 4, 10, 3, 5]并且[5, 3, 0, 1, 0]调用B()因为对于相同的位置,值永远不会相同.

注意(1)数组和矩阵行总是具有相同的大小N,以及(2)算法A() 在至少一个值匹配调用.

在C中执行此操作的最简单但非常天真的方法是:

for(int i=0; i<N; i++)
   if( A[i] == B[i] ){
      flag = 1;
      break;
   }
Run Code Online (Sandbox Code Playgroud)

这仍然非常低效.在最坏的情况下,我将进行N次比较.这里真正的问题是该算法可以进行数万亿次这些比较.

N(矩阵中数组/行的大小)从100到1000不等.我想加快这个程序.我看了矢量化,发现我可以使用cmpeq_pd.但是,矢量化仍然有限,因为我的所有条目都是 longs.有没有人有想法?我可以申请面具吗?

更多信息/背景:

  • 这是一种迭代算法.在每次迭代中,我将矩阵增加到一行并多次检查整个矩阵.我也可以更新几行.
  • 匹配的可能性不取决于位置.
  • 我愿意有误报和否定,以便大大加快这个程序.
  • 如果有匹配,在匹配验证的位置是相关的(我只需要知道,如果有一个匹配的位置).
  • 最大数量(约70%)的比较不会导致匹配.
  • 并行化在不同的级别完成,即该内核不能并行化.

c algorithm comparison compare vectorization

14
推荐指数
1
解决办法
474
查看次数

测量多线程应用程序的带宽

测量我的应用程序(使用OpenMP编写的多线程)使用的带宽的最简单,最有效的方法是什么?我跑了STREAM以获得最大值.可持续的带宽,我现在想知道我是否正在使整个可用带宽饱和.

我找到了几个相关的问题(例如主内存带宽测量),但我找不到这个问题的答案;

可悲的是,我不能使用VTune,但我可以使用PAPI计数器;

我的主要目标是找出我的应用程序的可扩展性是否与内存带宽的饱和度相关联.

谢谢

performance ram multithreading bandwidth openmp

8
推荐指数
1
解决办法
935
查看次数

SSE中的乘法减法

我正在矢量化一段代码,在某些时候我有以下设置:

register m128 a = { 99,99,99,99,99,99,99,99 }
register m128 b = { 100,50,119,30,99,40,50,20 }
Run Code Online (Sandbox Code Playgroud)

我目前正在short这些寄存器中打包,这就是为什么每个寄存器有8个值.如果第i个值大于或等于(在这种情况下,用常数99填充),我想要做的是b用相应的值减去第i个元素.为此,我首先在和之间使用大于或等于的操作,这产生了这个例子:abaaba

register m128 c = { 1,0,1,0,1,0,0,0 }
Run Code Online (Sandbox Code Playgroud)

为了完成操作,我想使用乘法和减法,即存储在b操作中b -= a*c.结果将是:

b = { 1,50,20,30,0,40,50,20 }
Run Code Online (Sandbox Code Playgroud)

有没有做这种事的操作?我发现的是Haswell的融合操作,但我目前正在研究Sandy-Bridge.此外,如果有人有更好的想法这样做,请告诉我(例如我可以做一个逻辑减法:如果1 c然后我减去,否则没有.

c sse vectorization

8
推荐指数
1
解决办法
380
查看次数

C ++对象在内存中是连续的吗?

我不太擅长C ++,目前正在将一些代码移植到C中。它分配了很多这样的对象:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));
Run Code Online (Sandbox Code Playgroud)

然后在每个职位上填写:

for(int u=0;u<SIZE;u++)
   nodes[u] = new o_list::Node();
Run Code Online (Sandbox Code Playgroud)

据我了解,关于连续内存的唯一保证是指向对象的指针实际上是连续的,也就是说,可能发生以下情况:

 _____________________
|x||x||x||x||x||x||x|x| -> contiguous array of pointers;
 |   \ \         
 |    \ \______
 |     \       \
 O      O       O       -> not contiguous positions of objects;
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我尝试先分配第一个数组(指针),然后再分配一个对象数组,然后将指针分配到正确的位置,如下所示:

o_list::Node** nodes = (o_list::Node**)malloc(SIZE*sizeof(o_list::Node*));

o_list::Node* contObjs = (o_list::Node*)malloc(SIZE*sizeof(o_list::Node));

for(int u=0;u<SIZE;u++){
   contObjs[u] = o_list::Node();
   nodes[u] = &contObjs[u];
}
Run Code Online (Sandbox Code Playgroud)

但这会导致分段错误。我想知道我的假设是否正确,以及为什么第二个选项中存在细分错误。

谢谢

c c++ memory arrays pointers

5
推荐指数
1
解决办法
890
查看次数

CUDA-capability和CUDA版本:兼容?

我有一台具有1.1计算能力的CUDA GPU的机器.我想重新安装CUDA,我想我会用5.0;

有没有CUDA功能和CUDA版本之间的兼容性?使用带有CC 1.1的CUDA 5.0会有麻烦吗?GPU?

谢谢!

cuda compute-capability

3
推荐指数
1
解决办法
3004
查看次数

Linux确实在C++代码中分配内存

在Linux中,内核在我们实际使用该内存之前不会分配任何物理内存页面,但我在这里很难找到它为什么实际上分配这个内存:

   for(int t = 0; t < T; t++){
      for(int b = 0; b < B; b++){
         Matrix[t][b].length = 0;
         Matrix[t][b].size = 60;
         Matrix[t][b].pointers = (Node**)malloc(60*sizeof(Node*)); 
         }
   }
Run Code Online (Sandbox Code Playgroud)

然后我访问这个数据结构,为它添加一个元素,如下所示:

   Node* elem = NULL;
   Matrix[a][b].length++;
   Matrix[a][b]->pointers[ Matrix[a][b].length ] = elem;
Run Code Online (Sandbox Code Playgroud)

基本上,我用htop运行我的程序,如果增加no,Linux会分配更多的内存.我在上面的代码中有"60".为什么?它不应该只在第一个元素添加到数组时分配一个页面吗?

c++ linux memory dynamic-memory-allocation

2
推荐指数
1
解决办法
196
查看次数