我需要一种快速的方法来获取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) 我有一个例程,在小矩阵(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) 我正在尝试配置我的应用程序,该应用程序在Windows上专门使用cuBLAS和Nvidia Visual Profiler,但它表明我的应用程序中根本没有GPU使用!也就是说,除了分析开销之外,时间线是完全空的.为了确保某人没有更改安全设置或我下面的内容,我使用内核和cudaMemcpy
调用来分析应用程序,并对其进行了正确的分析.是什么赋予了?我错过了一个设置吗?链接到错误版本的cuBLAS库?或者它实际上并没有调用GPU(虽然对我来说似乎完全不可能......)?我正在使用英特尔的编译器进行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位其他内在函数,还是我必须做一些内联汇编程序?
谢谢!
在Python中,我想知道为什么切片按照他们的方式工作.为什么Guido van Rossum定义a[start:end]
包括a[start]
但不 包括a[end]
,或者在标题中,为什么a[0:1]
只包含第一个元素而不包含前两个元素?
这似乎是MATLAB索引行为的一个退步.
编辑:我问这个问题的原因是它a[0:0]
是空的混乱.但我没有设计一种流行的语言,所以我知道什么.
c ×4
c++ ×2
performance ×2
cublas ×1
cuda ×1
intel-mic ×1
intel-mkl ×1
intel-vtune ×1
intrinsics ×1
nvidia ×1
openmp ×1
optimization ×1
profiling ×1
python ×1
slice ×1