±±¾©Ê¯ÓÍ»¯¹¤Ñ§Ôº2026ÄêÑо¿ÉúÕÐÉú½ÓÊÕµ÷¼Á¹«¸æ
²é¿´: 946  |  »Ø¸´: 0

cln116

¾èÖú¹ó±ö (ÖªÃû×÷¼Ò)

[ÇóÖú] CUDAºËº¯Êý¼ÆËã½á¹ûÓëC++Ñ­»·¼ÆËã½á¹ûÓÖ²î±ð£¬ÇóÖú¡£

ʹÓÃCUDAʱ¼ä²»³¤£¬Óöµ½Á˼¬ÊÖµÄÎÊÌ⣬ϣÍû¸ßÊÖÖ¸µã£¬Ð»Ð»¡£

ÓÃCUDAºËº¯Êý¼ÆËãµÄ½á¹ûÓëÓÃC++Ñ­»·µÄ½á¹ûÓвî±ð£¬Ö÷ÒªÊÇfloat×îºó2λ¡£³ÌÐòÖУ¬h_spec
Êý×éÓÃÓÚ´æ´¢C++Ñ­»·µÄ¼ÆËã½á¹û£¬d_specÓÃÓÚ´æ´¢ºËº¯Êý¼ÆËã½á¹û£¬½«d_spec¿½±´µ½Êý×éh_d_spec£¬±È½Ïh_specÓëh_d_spec¡£µ±h_specÓëh_d_spec¾ùÓÐ16641(129*129)¸öÔªËØÊ±£¬h_specÓëh_d_specÖв»ÏàµÈµÄÔªËØÊýΪ6723¡£²»ÏàµÈµÄÔªËØ²îÖµºÜС£¬ÀýÈ磺

h_d_spec[0] = 4.3036454e-008, h_spec[0] = 4.3036462e-008, ²îÖµ: -7.1054274e-015
h_d_spec[1] = 4.5101640e-008, h_spec[1] = 4.5101658e-008, ²îÖµ: -1.7763568e-014

²»ÖªµÀÕâÖÖ´íÎó²úÉúµÄÔ­Òòµ½µ×ÊÇʲô¡£Ô­ÒòÒ»£¬¿ÉÄÜÊdzÌÐòдµÃÓÐÎÊÌ⣻ԭÒò¶þ£¬CPUºÍGPU¸¡µã¾«¶ÈÓвî±ð¡£

³ÌÐòËùÓÃGPU: Geforce GTX 460, Geforce GT430¡£³ÌÐò´úÂëÈçÏ£º

// complex_test.cpp
#include "stdafx.h"
#include <math.h>
#include <cuda_runtime.h>
#include "iostream"
#include "stdlib.h"


#define _PI 3.14159265358979323846
#define _PI2 _PI*2.0
#define _GRAVITY 9.81
#define _GRAVITY2 96.2361

extern "C" void DEVICE_spec_func(float * spec, float A, float L, float Speed, float2 Dir_vector, int dim, float damping);

float spec_func(float A,
                      float2 Dir,
                      float Speed,
                      float2 K,
                      float reflDamping)
{
        float k2 = K.x * K.x + K.y * K.y;
        float Dir_len2 = Dir.x * Dir.x + Dir.y *Dir.y;

        if (k2 == 0.f)
                return 0.f;

        float k4 = k2 * k2;
        float KdotW =K.x * Dir.x + K.y * Dir.y;

        if (KdotW < 0.f)
                return 0.0f;

        float KdotWhat = KdotW*KdotW/(k2*Dir_len2);
        float Speed4 = pow(Speed, 4.0f);
        float eterm = exp( -1.0f * _GRAVITY2 / (k2*Speed4) ) / k4;

        float specResult = A * eterm * KdotWhat ;

        return specResult;
}


void test_spec()
{
        float L = 256.0f;
        float speed = 20.0f;
        float2 dir_vector;
        dir_vector.x = cos(_PI/4);
        dir_vector.x = sin(_PI/4);
        int _N = 128;
        float _A = pow(_PI2/L, 2.0) * 3.48/1000.0;

        float2 K;

        float * h_spec = (float *) malloc((_N+1)*(_N+1)*sizeof(float)); //host array
        float * d_spec = NULL; //device array
        cudaMalloc((void**)&d_spec,(_N+1)*(_N+1)*sizeof(float));
        float * h_d_spec = (float *) malloc((_N+1)*(_N+1)*sizeof(float)); //copy device array to the array
        float * differ = (float *) malloc((_N+1)*(_N+1)*sizeof(float)); //difference
        int num = 0;
        int h_nonezero_num = 0;
        int d_nonezero_num = 0;
        int h_d_zero = 0;
       
        for(int y=0; y<=_N; y++)
        {
                K.y = _PI2 / L * (float)(-_N/2 + y);
                for(int x=0; x<=_N; x++)
                {
                        K.x = _PI2 / L * (float)(-_N/2 + x);
                        int offset = y * (_N+1) + x;
                        h_spec[offset] = spec_func(_A, dir_vector, speed, K, 0.0);
                        if(h_spec[offset]!=0.0)
                        {
                                h_nonezero_num+=1;
                        }
                }
        }
       
        DEVICE_spec_func(d_spec, _A, L, speed, dir_vector, _N+1, 0.0f);
       
        cudaMemcpy(h_d_spec, d_spec, (_N+1)*(_N+1)*sizeof(float), cudaMemcpyDeviceToHost);
        for(int y=0; y<=_N; y++)
        {
                for(int x=0; x<=_N; x++)
                {
                        int offset = y * (_N+1) + x;
                        differ[offset] = h_d_spec[offset] - h_spec[offset];
                        if(h_d_spec[offset]!=0.0)
                        {
                                d_nonezero_num += 1;
                        }
                        if(differ[offset] != 0.0)
                        {
                                num += 1;
                        }
                        if(h_spec[offset]!=0.0 && h_d_spec[offset]==0.0 )
                        {
                                h_d_zero += 1;
                        }
                }
        }
        printf("Not equal: %d \n", num);

}

int _tmain(int argc, _TCHAR* argv[])
{
       
        test_spec();
        return 0;
}

//kernel.cu
#include "cuda_runtime.h"
#include "device_functions_decls.h"
#include "cufft.h"
#include "cufftw.h"
#include "curand.h"
//#include "math.h"

#define _PI 3.14159265358979323846
#define _PI2 _PI*2.0
#define _GRAVITY 9.81
#define _GRAVITY2 96.2361


__device__ float d_spec_func(const float A,
                                 const float2 Dir,
                                 const float Speed,
                                 const float2 K,
                                 const float reflDamping)
{
        float k2 = K.x * K.x + K.y * K.y;
        float Dir_len2 = Dir.x * Dir.x + Dir.y *Dir.y;

        if (k2 == 0.f)
                return 0.f;

        float k4 = k2 * k2;
        float KdotW =K.x * Dir.x + K.y * Dir.y;
        if (KdotW < 0.f)
                return 0.0f;

        float KdotWhat = KdotW*KdotW/(k2*Dir_len2);
        float Speed4 = pow(Speed, 4.0f);
        float eterm = exp( -1.0f * _GRAVITY2 / (k2*Speed4) ) / k4;

        float specResult = A * eterm * KdotWhat ;
        //float specResult = KdotWhat;

        return specResult;
}

__global__ void kernel_spec(float * spec,
                                         float A,
                                         float L,
                                         float Speed,
                                         float2 Dir_vector,
                                         int dim,
                                         float damping)
{
        int x = threadIdx.x + blockIdx.x * blockDim.x;
        int y = threadIdx.y + blockIdx.y * blockDim.y;       
        int offset = x + y * dim;
        float2 K;
        K.x = _PI2 / L * (float)(-(dim-1)/2 + x);
        K.y = _PI2 / L * (float)(-(dim-1)/2 + y);
        spec[offset] = d_spec_func(A, Dir_vector, Speed, K, damping);
}

extern "C"
void DEVICE_spec_func(float * spec,
                                   float A,
                                   float L,
                                   float Speed,
                                   float2 Dir_vector,
                                   int dim,
                                   float damping)
{
        dim3 threads(1,1,1);
        dim3 blocks(dim, dim, 1);
        kernel_spec<<<blocks, threads>>>(spec, A, L, Speed, Dir_vector, dim, damping);
}
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

Åû¾£Õ¶¼¬ÖÐǰ½ø¡£
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ cln116 µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] 285Çóµ÷¼Á +5 AZMK 2026-04-02 7/350 2026-04-02 16:22 by AZMK
[¿¼ÑÐ] һ־Ըɽ¶«´óѧ£¬085600£¬344 +3 κ×Óper 2026-04-02 4/200 2026-04-02 16:21 by Creta
[¿¼ÑÐ] 348Çóµ÷¼Á +10 zzzzyk123 2026-04-01 10/500 2026-04-02 16:04 by ÖзÉÔº¿Õ¹ÜѧԺÑ
[¿¼ÑÐ] 321Çóµ÷¼Á Ò»Ö¾Ô¸ Õã½­¹¤Òµ´óѧÉúÎïÒ½Ò© +5 ºÙºÙHC 2026-04-01 6/300 2026-04-02 15:23 by sophie2180
[¿¼ÑÐ] 366Çóµ÷¼ÁÒ»Ö¾Ô¸¶«±±´óѧ +7 ÔËÆøÀ´µÃÈôÓÐËÆÎ 2026-04-02 7/350 2026-04-02 14:47 by °¶ÉϵÄÒ»ÌõÓã
[¿¼ÑÐ] 311Çóµ÷¼Á +14 À¶ÔÂÁÁÁÁ 2026-03-30 14/700 2026-04-02 12:18 by 1753564080
[¿¼ÑÐ] 085410 Ò»Ö¾Ô¸211 22408·ÖÊý359Çóµ÷¼Á +3 123456789qw 2026-03-31 4/200 2026-04-02 00:06 by ÒåÎÄwang
[¿¼ÑÐ] ½­ËտƼ¼´óѧÕвÄÁÏÑо¿Éú +4 Su032713. 2026-04-01 5/250 2026-04-01 22:03 by cccchenso
[¿¼ÑÐ] 085600 Ò»Ö¾Ô¸9 ×Ü·Ö351 Çóµ÷¼ÁѧУ +7 czhcz 2026-03-31 9/450 2026-04-01 19:24 by Î޼ʵIJÝÔ­
[¿¼ÑÐ] 326Çóµ÷¼Á +4 áÌáÌ×Ð 2026-03-31 4/200 2026-04-01 09:58 by ÎҵĴ¬Îҵĺ£
[¿¼ÑÐ] ¿¼ÑвÄÁϹ¤³Ì351·Öµ÷¼Á +5 Õû¸öºÃµÄ 2026-03-31 5/250 2026-04-01 09:36 by topgun2009
[¿¼ÑÐ] 333Çóµ÷¼Á +4 °¢¿ÆÒÝ 2026-03-31 4/200 2026-04-01 09:11 by jp9609
[¿¼ÑÐ] ²ÄÁϹ¤³Ì085601Êý¶þÓ¢Ò»335Çóµ÷¼Á +5 Ë«ÂíβƦÀϰå2 2026-03-31 5/250 2026-03-31 19:07 by Wang200018
[¿¼ÑÐ] ±¾2Ò»Ö¾Ô¸C9-333·Ö£¬²ÄÁÏ¿ÆÑ§Ó빤³Ì£¬Çóµ÷¼Á +9 ÉýÉý²»½µ 2026-03-31 9/450 2026-03-31 18:01 by Î޼ʵIJÝÔ­
[¿¼ÑÐ] 323·Ö ʳƷÓëÓªÑøµ÷¼Á +3 ºÙooo 2026-03-31 3/150 2026-03-31 09:38 by longlotian
[Óлú½»Á÷] ¿¼Ñе÷¼Á +8 watb 2026-03-26 8/400 2026-03-30 18:40 by 544594351
[¿¼ÑÐ] 317·Ö Ò»Ö¾Ô¸ÄÏÀí¹¤²ÄÁϹ¤³Ì ±¾¿Æºþ¹¤´ó Çóµ÷¼Á +12 ÓóÄàСÁåîõ 2026-03-28 12/600 2026-03-30 17:06 by wangjy2002
[¿¼ÑÐ] 303Çóµ÷¼Á +7 DLkz1314. 2026-03-30 7/350 2026-03-30 16:05 by shuang5186
[¿¼ÑÐ] Çóµ÷¼Á +10 ÕÅzz111 2026-03-27 11/550 2026-03-30 09:17 by Î޼ʵIJÝÔ­
[¿¼ÑÐ] 279Çóµ÷¼Á +4 µûÎèÇáÈÆ 2026-03-29 4/200 2026-03-29 09:45 by laoshidan
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û