我想我专注于x86,但我通常对从32位到64位的移动感兴趣.
从逻辑上讲,我可以看到常量和指针在某些情况下会更大,因此程序可能会更大.为了提高效率而在字边界上分配内存的愿望意味着分配之间会有更多的空白.
我还听说x86上的32位模式必须在上下文切换时刷新其缓存,因为可能存在重叠的4G地址空间.
那么,64位的真正好处是什么?
作为补充问题,128位会更好吗?
编辑:
我刚刚编写了我的第一个32/64位程序.它生成16字节(32b版本)或32字节(64b版本)对象的链接列表/树,并对stderr进行大量打印 - 不是一个非常有用的程序,而不是典型的,但它是我的第一个.
大小:81128(32b)v 83672(64b) - 所以差别不大
速度:17s(32b)v 24s(64b) - 在32位OS(OS-X 10.5.8)上运行
更新:
我注意到正在开发一种新的混合x32 ABI(应用程序二进制接口),它是64b但使用32b指针.对于某些测试,它导致比32b或64b更小的代码和更快的执行.
我想要一个128位整数,因为我想存储两个64位数的乘法结果.在gcc 4.4及以上版本中有没有这样的东西?
我正在为128位数字的长流写一个压缩器.我想将数字存储为差异 - 仅存储数字之间的差异而不是数字本身,因为我可以将差异打包在更少的字节中,因为它们更小.
但是,对于压缩,我需要减去这些128位值,对于解压缩,我需要添加这些值.我的编译器的最大整数大小是64位宽.
任何人有任何想法有效地做到这一点?
gcc是否支持amd64上的128位int?
如何定义?
如何使用scanf/printf进行读/写?
我发现手动计算%
运算符__int128
比内置的编译器运算符要快得多。我将向您展示如何计算模 9,但该方法可用于计算模任何其他数字。
首先,考虑内置编译器操作符:
uint64_t mod9_v1(unsigned __int128 n)
{
return n % 9;
}
Run Code Online (Sandbox Code Playgroud)
现在考虑我的手动实现:
uint64_t mod9_v2(unsigned __int128 n)
{
uint64_t r = 0;
r += (uint32_t)(n);
r += (uint32_t)(n >> 32) * (uint64_t)4;
r += (uint32_t)(n >> 64) * (uint64_t)7;
r += (uint32_t)(n >> 96);
return r % 9;
}
Run Code Online (Sandbox Code Playgroud)
测量超过 100,000,000 个随机数给出以下结果:
mod9_v1 | 3.986052 secs
mod9_v2 | 1.814339 secs
Run Code Online (Sandbox Code Playgroud)
GCC 9.3.0 with-march=native -O3
用于 AMD Ryzen Threadripper 2990WX。
这是godbolt的链接。
我想问一下它在你这边的行为是否相同?(在向 GCC Bugzilla …
我有中等大小的C99程序,它使用long double
类型(80位)进行浮点计算.我想用新的GCC 4.6扩展来提高精度__float128
.我得到的是,它是一个软件模拟的128位精度数学.
我应该如何使用全精度的软件仿真将我的程序从80位的经典长双精度转换为128位的四重浮点数?我需要改变什么?编译器标志,来源?
我的程序读取了全精度值strtod
,对它们进行了很多不同的操作(比如+ - */sin,cos,exp和其他<math.h>
)和printf
-ing.
PS:尽管float128仅针对Fortran(REAL*16)声明,但libquadmath是用C语言编写的,它使用float128.我不确定GCC会将float128上的操作转换为运行时库吗?我不确定如何在我的源代码中从long double迁移到__float128.
PPS:有关于"C"语言gcc模式的文档:http://gcc.gnu.org/onlinedocs/gcc/Floating-Types.html
"GNU C编译器支持... 128位(TFmode)浮点类型.支持其他类型包括算术运算符:加,减,乘,除 ;一元算术运算符;关系运算符;等于运算符... __float128类型支持i386,x86_64"
我刚刚设法在Linux Ubuntu 10.04下安装我的cuda SDK.我的显卡是NVIDIA geForce GT 425M,我想用它来解决一些繁重的计算问题.我想知道的是:有没有办法使用一些无符号的128位int var?当使用gcc在CPU上运行我的程序时,我使用的是__uint128_t类型,但是将它与cuda一起使用似乎不起作用.在cuda上有128位整数可以做些什么吗?
非常感谢Matteo Monti Msoft编程
我正在尝试使用Lapack进行矩阵奇异值分解(SVD)的128位精度计算,我发现有一些黑色编译器魔术可以实现这一点.英特尔Fortran编译器(ifort)支持-r16
指示编译器将所有变量声明为DOUBLE PRECISION
128位实数的选项.所以我使用以下方法编译了Lapack和BLAS:
ifort -O3 -r16 -c isamax.f -o isamax.o
ifort -O3 -r16 -c sasum.f -o sasum.o
...
Run Code Online (Sandbox Code Playgroud)
要将其合并到我的程序(也就是C++)中,我可以使用英特尔C++编译器(icc)和-Qoption,cpp,--extended_float_type
创建数据类型_Quad
为128位浮点变量的选项.我的SVD示例如下所示:
#include "stdio.h"
#include "iostream"
#include "vector"
using namespace std;
typedef _Quad scalar;
//FORTRAN BINDING
extern "C" void dgesvd_(char *JOBU, char *JOBVT, int *M, int *N,
scalar *A, int *LDA,
scalar *S,
scalar *U, int *LDU,
scalar *VT, int *LDVT,
scalar *WORK, int *LWORK, int *INFO);
int main() {
cout << …
Run Code Online (Sandbox Code Playgroud) 我们可以使用预处理器来知道是否unsigned long long
定义了:
#include <limits.h>
#ifndef ULLONG_MAX
typedef unsigned long t_mask;
#else
typedef unsigned long long t_mask;
#endif
Run Code Online (Sandbox Code Playgroud)
但是如何知道如何__uint128_t
定义?