簡體   English   中英

我如何加快這個CUDA程序?

[英]How can I speed up this cuda program?

我正在學習CUDA。 我寫了這個程序來測試數字是否為質數。 它比cpu實施慢許多倍。 我是否在做任何公然錯誤的事情,如果可以,那么我該如何加快它的速度(我也知道我不需要檢查偶數,只是我還沒有對該優化進行編碼。)我還嘗試了可視分析器。 看起來它大部分時間都花在memcpyToSymbol中。

#include <cuda.h>
#include <iostream>
#include <cmath>
#include <cstdint>
#include <stdio.h>
#include <ctime>

__device__ bool _not_prime_flag;
__global__ void cuda_prime_kernel(uint32_t n, uint32_t sr)
{
    uint32_t d = blockIdx.x * blockDim.x + threadIdx.x;
    if(d > 2 && d <= sr && n % d == 0)
        _not_prime_flag = true;
}
bool cuda_prime(uint32_t n)
{
    if(n == 2)
        return true;
    if(n % 2 == 0)
        return false;

    bool not_prime = false;
    cudaMemcpyToSymbol(_not_prime_flag, &not_prime, 1, 0, cudaMemcpyHostToDevice);
    uint32_t sr = sqrt(n);

    unsigned int blocks = sr / 32 + 1;
    cuda_prime_kernel<<<blocks, 32>>>(n, sr);
    cudaMemcpyFromSymbol(&not_prime, _not_prime_flag, 1, 0, cudaMemcpyDeviceToHost);
    return !not_prime;
}

bool cpu_prime(uint32_t n)
{
    if(n == 2)
        return true;
    if(n % 2 == 0)
        return false;
    std::cout << "Here" << std::endl;
    uint32_t sr = sqrt(n);

    for(uint32_t i = 3; i <= sr; i += 2)
        if(n % i == 0)
            return false;
    return true;
}

int main()
{
    std::cout << cuda_prime(1000001) << std::endl;
    return 0;
}

請記住,CUDA必須將必要的變量從CPU復制到GPU( cudaMemcpyToSymbol ),然后再從GPU復制到CPU( cudaMemcpyFromSymbol )。 實際上,這需要花費很多時間。 如果您要測試的數目很小,則CPU代碼將明顯更快,因為它不必擔心昂貴的內存傳輸。 如果使用很大的數字,您只會看到CUDA代碼的重大改進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM