小编And*_*rew的帖子

返回64位整数中所有设置位的最快方法是什么?

我需要一种快速的方法来获取64位整数中所有位的位置.例如,给定x = 123703,我想填充一个数组idx[] = {0, 1, 2, 4, 5, 8, 9, 13, 14, 15, 16}.我们可以假设我们先验地知道比特数.这将被称为10 ^ 12 - 10 ^ 15次,因此速度至关重要.到目前为止,我提出的最快答案是以下怪物,它使用64位整数的每个字节作为表的索引,这些表给出了在该字节中设置的位数以及这些位的位置:

int64_t x;            // this is the input
unsigned char idx[K]; // this is the array of K bits that are set
unsigned char *dst=idx, *src;
unsigned char zero, one, two, three, four, five;  // these hold the 0th-5th bytes
zero  =  x & 0x0000000000FFUL;
one   = (x & 0x00000000FF00UL) >> 8;
two   = (x & …
Run Code Online (Sandbox Code Playgroud)

c c++ optimization performance bit-manipulation

40
推荐指数
3
解决办法
4877
查看次数

英特尔Phi上的MKL性能

我有一个例程,在小矩阵(50-100 x 1000个元素)上执行一些MKL调用以适合模型,然后我调用不同的模型.在伪代码中:

double doModelFit(int model, ...) {
   ...
   while( !done ) {
     cblas_dgemm(...);
     cblas_dgemm(...);
     ...
     dgesv(...);
     ...
   }
   return result;
}

int main(int argc, char **argv) {
  ...
  c_start = 1;  c_stop = nmodel;
  for(int c=c_start; c<c_stop; c++) {
    ...
    result = doModelFit(c, ...);
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

调用上面的版本1.由于模型是独立的,我可以使用OpenMP线程来并行化模型拟合,如下所示(版本2):

int main(int argc, char **argv) {
  ...
  int numthreads=omp_max_num_threads();
  int c;
#pragma omp parallel for private(c)
  for(int t=0; t<numthreads; t++) {  
     // assuming nmodel divisible by numthreads...      
     c_start = t*nmodel/numthreads+1; 
     c_end …
Run Code Online (Sandbox Code Playgroud)

c openmp intel-vtune intel-mkl intel-mic

6
推荐指数
1
解决办法
689
查看次数

剖析cublas应用程序

我正在尝试配置我的应用程序,该应用程序在Windows上专门使用cuBLAS和Nvidia Visual Profiler,但它表明我的应用程序中根本没有GPU使用!也就是说,除了分析开销之外,时间线是完全空的.为了确保某人没有更改安全设置或我下面的内容,我使用内核和cudaMemcpy调用来分析应用程序,并对其进行了正确的分析.是什么赋予了?我错过了一个设置吗?链接到错误版本的cuBLAS库?或者它实际上并没有调用GPU(虽然对我来说似乎完全不可能......)?我正在使用英特尔的编译器进行64位支持,如果这有所不同的话.

谢谢!

c profiling cuda nvidia cublas

4
推荐指数
1
解决办法
250
查看次数

内部计算64位整数中的尾随零位?

这是关于位操作的一些先前问题的后续跟进.我修改了这个站点的代码来枚举设置了N位的K的字符串(x是设置int64_t了K位的当前值,并且在这段代码的末尾,它是按字典顺序排列的下一个整数,设置了K位):

int64_t b, t, c, m, r,z;
b = x & -x;
t = x + b;
c = x^t;
// was m = (c >> 2)/b per link
z = __builtin_ctz(x);
m = c >> 2+z;
x = t|m;
Run Code Online (Sandbox Code Playgroud)

__builtin_ctz()只要最不重要的一位在x的较低DWORD中,使用的修改就可以正常工作,但如果不是,则它完全断开.这可以通过以下代码看到:

for(int i=0; i<64; i++) printf("i=%i, ctz=%i\n", i, __builtin_ctz(1UL << i));
Run Code Online (Sandbox Code Playgroud)

打印GCC版本4.4.7:

i=0, ctz=0
i=1, ctz=1
i=2, ctz=2
Run Code Online (Sandbox Code Playgroud)

...

i=30, ctz=30
i=31, ctz=31
i=32, ctz=0
Run Code Online (Sandbox Code Playgroud)

或者对于icc版本14.0.0类似的东西(除了i> 32给出随机结果,而不是零).在两种情况下使用除法而不是移动2 + z都有效,但是在我的Sandy Bridge Xeon上它的速度大约慢了5倍.我应该使用64位其他内在函数,还是我必须做一些内联汇编程序?

谢谢!

c c++ performance bit-manipulation intrinsics

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

Python范围切片和索引行为

在Python中,我想知道为什么切片按照他们的方式工作.为什么Guido van Rossum定义a[start:end]包括a[start] 包括a[end],或者在标题中,为什么a[0:1]只包含第一个元素而不包含前两个元素?

这似乎是MATLAB索引行为的一个退步.

编辑:我问这个问题的原因是它a[0:0]是空的混乱.但我没有设计一种流行的语言,所以我知道什么.

python slice

-1
推荐指数
1
解决办法
221
查看次数