我有以下功能:
void *foo(void *i) {
int a = (int) i;
}
int main() {
pthread_t thread;
int i;
pthread_create(&thread, 0, foo, (void *) i);
}
Run Code Online (Sandbox Code Playgroud)
在编译时,有一些关于强制转换((void *) i和int a = (int) i)的错误.如何pthread_create正确传递整数作为最后一个参数?
我正在寻找在AVX元件(单精度浮点)上运行的指数函数的有效(快速)近似.即 - __m256 _mm256_exp_ps( __m256 x )没有SVML.
相对精度应该类似于~1e-6,或~20个尾数位(1 ^ 2 ^ 20).
如果用英特尔内在函数用C风格编写,我会很高兴.
代码应该是可移植的(Windows,macOS,Linux,MSVC,ICC,GCC等).
这类似于使用SSE的指数函数的最快实现,但是这个问题寻求非常快速且精度低(当前的答案提供了大约1e-3的精度).
此外,这个问题是寻找AVX/AVX2(和FMA).但请注意,这两个问题的答案很容易在SSE4 __m128或AVX2 之间移植__m256,因此未来读者应根据所需的精度/性能权衡进行选择.
在对我们的应用程序中的一些性能问题进行故障排除时,我发现C的stdio.h功能(至少对我们的供应商来说,C++的fstream类)是线程安全的.因此,每次我做一些简单的操作时fgetc,RTL必须获取锁,读取一个字节并释放锁.
这对性能不利.
在C和C++中获取非线程安全文件I/O的最佳方法是什么,这样我可以自己管理锁定并获得更好的性能?
_fputc_nolock,和GCC提供unlocked_stdio和flockfile,但我无法找到我的编译器(CodeGear的C++ Builder的)任何类似的功能.其他人如何处理这个问题?
编辑:由于有些人想知道,我在发布前测试了这个. fgetc如果它可以满足从其缓冲区读取的数量,它不会进行系统调用,但它仍然会进行锁定,因此锁定会占用大量的时间(从磁盘读取的单个数据块需要数百个锁来获取和释放) .不做一次一个字符I/O将是一个解决方案,但fstream不幸的是C++ Builder的类使用fgetc(所以如果我想使用iostream类,我会坚持使用它),并且我有很多遗产使用fgetc和朋友从记录样式文件中读取字段的代码(如果不是锁定问题,这将是合理的).