两个矢量相加

/*
 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
 *
 * Please refer to the NVIDIA end user license agreement (EULA) associated
 * with this source code for terms and conditions that govern your use of
 * this software. Any use, reproduction, disclosure, or distribution of
 * this software and related documentation outside the terms of the EULA
 * is strictly prohibited.
 *
 */

/* Vector addition: C = A + B.
 *
 * This sample is a very basic sample that implements element by element
 * vector addition. It is the same as the sample illustrating Chapter 3
 * of the programming guide with some additions like error checking.
 *
 */

// Includes
#include <stdio.h>
#include <cutil_inline.h>

// Variables
float* h_A;
float* h_B;
float* h_C;
float* d_A;
float* d_B;
float* d_C;
bool noprompt = false;

// Functions
void Cleanup(void);
void RandomInit(float*, int);
void ParseArguments(int, char**);

// Device code
__global__ void VecAdd(const float* A, const float* B, float* C, int N)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N)
        C[i] = A[i] + B[i];
}

// Host code
int main(int argc, char** argv)
{
    printf("Vector addition/n");
    int N = 50000;
    size_t size = N * sizeof(float);
    ParseArguments(argc, argv);

    // Allocate input vectors h_A and h_B in host memory
    h_A = (float*)malloc(size);
    if (h_A == 0) Cleanup();
    h_B = (float*)malloc(size);
    if (h_B == 0) Cleanup();
    h_C = (float*)malloc(size);
    if (h_C == 0) Cleanup();
   
    // Initialize input vectors
    RandomInit(h_A, N);
    RandomInit(h_B, N);

    // Allocate vectors in device memory
    cutilSafeCall( cudaMalloc((void**)&d_A, size) );
    cutilSafeCall( cudaMalloc((void**)&d_B, size) );
    cutilSafeCall( cudaMalloc((void**)&d_C, size) );

    // Copy vectors from host memory to device memory
    cutilSafeCall( cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice) );
    cutilSafeCall( cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice) );

    // Invoke kernel
    int threadsPerBlock = 256;
    int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
    VecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);
    cutilCheckMsg("kernel launch failure");
#ifdef _DEBUG
    cutilSafeCall( cudaThreadSynchronize() );
#endif

    // Copy result from device memory to host memory
    // h_C contains the result in host memory
    cutilSafeCall( cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost) );
   
    // Verify result
    int i;
    for (i = 0; i < N; ++i) {
        float sum = h_A[i] + h_B[i];
        if (fabs(h_C[i] - sum) > 1e-5)
            break;
    }
    printf("%s /n", (i == N) ? "PASSED" : "FAILED");
   
    Cleanup();
}

void Cleanup(void)
{
    // Free device memory
    if (d_A)
        cudaFree(d_A);
    if (d_B)
        cudaFree(d_B);
    if (d_C)
        cudaFree(d_C);

    // Free host memory
    if (h_A)
        free(h_A);
    if (h_B)
        free(h_B);
    if (h_C)
        free(h_C);
       
    cutilSafeCall( cudaThreadExit() );
   
    if (!noprompt) {
        printf("/nPress ENTER to exit.../n");
        fflush( stdout);
        fflush( stderr);
        getchar();
    }

    exit(0);
}

// Allocates an array with random float entries.
void RandomInit(float* data, int n)
{
    for (int i = 0; i < n; ++i)
        data[i] = rand() / (float)RAND_MAX;
}

// Parse program arguments
void ParseArguments(int argc, char** argv)
{
    for (int i = 0; i < argc; ++i)
        if (strcmp(argv[i], "--noprompt") == 0 ||
   strcmp(argv[i], "-noprompt") == 0)
  {
            noprompt = true;
            break;
        }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
永磁同步电动机简介 因此永磁同步电机矢量控制系统引起了国内外学者的 近些年,人们对它的研究也越来越感兴趣,在医疗器械、化工、轻纺、 电动自行车等领 永磁同步电机系统的结构 产生与电源频率同步的旋转磁场。转子是用永磁材料做成的永磁体,它在定 坐标变换 坐标变换 从数学角度看,就是将方程中原来的一组变量,用一组新的变量 线性变换是指这种新旧变量之间存在线性关系。电动机中用到的坐标变 一种是固定在定子上的它相对我们是静 α,β 坐标系,它的方向和定子三相绕组的位置相对固定,它的方向 A 相的产生磁势的方向,另一种是固定在转子上的旋转坐标系, d,q坐标,其中 d 轴跟单磁极的 N 极方向相同,即和磁力线 q 轴超前 d 轴 90 度下图所示。 我们获取的是定子绕组上的三相电流,所以我们还需要做的 α,β坐标系中和 d,q 坐标 α,β坐标系和 A,B,C 三相之间的变换(以电流为例)。 α轴β轴 A 轴 B 轴和 C 轴上的投影。 ABCO3ANi3BNi3CNi2Ni2Ni 需要在它 /dq(Park )和其逆变换如下: 而矢量控 因此我们有必要讨论一下永磁同步电机在 ,q坐标系下的数学型。 id = 0,所以: q 轴电流成正比,只要对电流进行控制就达到了控制转矩 TL,J 分别为电机的阻转矩和转动系统的转动惯量。 . 矢量控制原理介绍 (FOC),其基本思路是:通过坐标变换实现拟直 ,其实现步骤如下: ,将三相静止坐标变换成二相 也就是 Clarke 变换,将三相的电流先转变到静止坐标系,再通过旋 Park 变换,Park 变换中定 2 个直流分量 id、iq(其中 id 为励磁 ,iq 为转矩电流分量)。 通过控制器对其速度电流环进行控制,控制 id 就相当于控制磁通,而控 iq 就相当于控制转矩。Iq 调节参考量是由速度控制器给出,经过电流环调 d,q 轴上的电压分量即 ud 和 uq。. ud 和 uq 通过 Park 逆变换。 SVPWM 空间矢量合成方法实现矢量控制量输出,达到矢量控制的 . SVPWM产生原理 是空间电压矢量 PWM 波产生,它具有电压利用率高、低谐波成 开关次数少和功率管功耗小等特点。同时,SVPWM 还能很好的结合矢量控制 为矢量控制得实现提供很好的途径,以最大限度的发挥设备的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值