假设我想定义一个表示向量长度的结构及其值,如下所示:
struct Vector{
double* x;
int n;
};
Run Code Online (Sandbox Code Playgroud)
现在,假设我想定义一个向量y并为其分配内存.
struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector));
Run Code Online (Sandbox Code Playgroud)
我在互联网上的搜索显示我应该分别为x分配内存.
y->x = (double*)malloc(10*sizeof(double));
Run Code Online (Sandbox Code Playgroud)
但是,似乎我为y-> x分配内存两次,一次为y分配内存,另一种为y-> x分配内存,这似乎浪费了内存.如果让我知道编译器真正做了什么以及初始化y和y-> x的正确方法,我们非常感激.
提前致谢.
我正在调查矢量化对程序性能的影响.在这方面,我写了以下代码:
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#define LEN 10000000
int main(){
struct timeval stTime, endTime;
double* a = (double*)malloc(LEN*sizeof(*a));
double* b = (double*)malloc(LEN*sizeof(*b));
double* c = (double*)malloc(LEN*sizeof(*c));
int k;
for(k = 0; k < LEN; k++){
a[k] = rand();
b[k] = rand();
}
gettimeofday(&stTime, NULL);
for(k = 0; k < LEN; k++)
c[k] = a[k] * b[k];
gettimeofday(&endTime, NULL);
FILE* fh = fopen("dump", "w");
for(k = 0; k < LEN; k++)
fprintf(fh, "c[%d] = %f\t", k, c[k]);
fclose(fh);
double …Run Code Online (Sandbox Code Playgroud) 我有一个简单的循环C,我转换magnitude,并angle以real和imaginary零件.我有两个版本的循环.Version 1是一个简单的for循环,我使用以下代码执行转换
for(k = 0; k < n; k++){
xReal[k] = Mag[k] * cos(Angle[k]);
xImag[k] = Mag[k] * sin(Angle[k]);
}
Run Code Online (Sandbox Code Playgroud)
一个Version 2地方Intrinsics用于向量化的循环.
__m256d cosVec, sinVec;
__m256d resultReal, resultImag;
__m256d angVec, voltVec;
for(k = 0; k < SysData->totNumOfBus; k+=4){
voltVec = _mm256_loadu_pd(volt + k);
angVec = _mm256_loadu_pd(theta + k);
sinVec = _mm256_sincos_pd(&cosVec, angVec);
resultImag = _mm256_mul_pd(voltVec, sinVec);
resultReal = _mm256_mul_pd(voltVec, cosVec);
_mm256_store_pd(xReal+k, resultReal);
_mm256_store_pd(xImag+k, resultImag); …Run Code Online (Sandbox Code Playgroud) 我在MATLAB中编写了以下代码:
#include <string.h>
#include <stdlib.h>
#include "mex.h"
#include "matrix.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]){
double* x = (double*)malloc(5 * sizeof(*x));
int k;
for(k=0;k<5;k++)
x[k] = k;
mxArray* p1 = mxCreateDoubleMatrix(5, 1, mxREAL);
mxSetPr(p1, x);
}
Run Code Online (Sandbox Code Playgroud)
我在没有输入或输出的情况下调用该函数.除了初始化一些向量之外,代码什么也没做.我知道代码有严重的内存泄漏,但除了内存泄漏,当我调用该函数时,MATLAB关闭.
如果我替换malloc为mxMalloc,代码将执行没有问题.我知道使用mx*来分配内存是可取的,但我确信malloc和calloc以及free都可以在MEX中使用而没有任何问题.
我也删除了(double*),但它仍然崩溃了.
如果让我知道为什么提到的代码导致MATLAB崩溃,我们将不胜感激.谢谢
我在C中构造函数的偏导数.该过程主要由大量小循环组成.每个循环负责填充矩阵的列.因为矩阵的大小很大,所以应该有效地编写代码.我对实施有很多计划,我不想深入了解细节.
我知道智能编译器会尝试自动利用缓存.但我想了解更多使用缓存和编写高效代码和高效循环的细节.如果提供一些资源或网站,我将不胜感激,因此我可以更多地了解如何在减少内存访问时间和利用优势方面编写有效代码.
我知道我的请求看起来很草率,但我不是电脑人.我做了一些研究但没有成功.所以,任何帮助表示赞赏.
谢谢
我想在ubuntu中编译一个使用mexgcc配置的C代码.我可以在OSX中顺利编译代码.然而,当我想编译它在Linux中,编译器生成的注释行的错误开始//(它工作正常/* */.由于该方案包括来自第三方库的几个头文件,我不能代替//用/* */.我想知道是否有办法克服这个问题.
MATLAB版本:Linux中的R2012b gcc版本:OSX中的4.7.2 gcc版本:4.2.1
任何帮助表示赞赏
编辑:这是我用来编译代码的命令:
mex -g -largeArrayDims -ldl TDSVDHNGateway.c
Run Code Online (Sandbox Code Playgroud)
以下是mex生成的错误:
In file included from TDSVDHNGateway.c:2:0:
TDS.h:17:1: error: expected identifier or ‘(’ before ‘/’ token
TDS.h:26:2: error: unknown type name ‘index_t’
TDS.h:27:2: error: unknown type name ‘index_t’
In file included from TDSVDHNGateway.c:2:0:
TDS.h:146:3: error: unknown type name ‘index_t’
TDSVDHNGateway.c:37:3: error: unknown type name ‘index_t’
TDSVDHNGateway.c: In function ‘mexFunction’:
TDSVDHNGateway.c:166:25: error: ‘index_t’ undeclared (first use in this function) …Run Code Online (Sandbox Code Playgroud) 我有一个关于减少循环中内存调用次数的问题.考虑以下代码(这不是我的代码,因为它太长了,因为我不能在这里代表它):
for(k=0;k<n;k++)
{
y[k] = x[0]*2 + z[1];
}
Run Code Online (Sandbox Code Playgroud)
如您所见,在每次迭代中,都会调用内存中的相同块(x [0],z [1]).我想知道在多次调用相同内存块时是否有任何方法可以减少内存访问.提前致谢.
我很想知道dlopen在Linux中使用它来调用共享库.假设我想在C中使用名为的共享库fileName.so.我在64位Ubuntu Linux中工作,我包含dlfcn.h并使用dlopen函数来访问共享库.
当我使用时dlopen(fileName.so, RTLD_LAZY),返回NULL句柄并且不打开共享库.但是,当我使用dlopen("./fileName.so", RTLD_LAZY)它dlopen完成它的工作并打开共享库.似乎主要的一点是在./文件名之前使用.
如果帮助我找出我应该./在我的代码中使用的原因,我们将不胜感激.谢谢
我在C中使用以下命令来为d分配80个字节(在64位系统中).
double *d = calloc(10, sizeof(double));
Run Code Online (Sandbox Code Playgroud)
并使用以下循环初始化d
for (k=0;k<11;k++){
d[k] = k;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,没有错误.但我觉得,因为在上限k是11,应该有什么不对,因为d是长度的阵列10.请让我知道为什么程序没有错误执行.提前致谢.
c ×8
performance ×3
mex ×2
caching ×1
for-loop ×1
gcc ×1
icc ×1
intrinsics ×1
loops ×1
malloc ×1
matlab ×1
optimization ×1
simd ×1
sse ×1