2017-10-30 20 views
0

Cudaを使用して数の最大の素因数を見つけることについて他の話題を見つけることができず、いくつかの問題があります。Cudaを使用して素因数を見つける

#include <cuda.h> 
#include <math.h> 
#include <stdio.h> 

__device__ int checkFactor (long long product, long long factor) 
{ 
return product % factor == 0; 
} 

__global__ void factorKernel (long long product, long long limit, long long *result) 
{ 
/******************/ 
/* Your code here */ 
/******************/ 

/* 1. Calculate f from thread ID */ 
long long f = threadIdx.x; 

/* 2. Caluclate number of thread */ 
int numThreads = blockIdx.x * blockDim.x; 

/* 3. While f is within limit  */ 
/* 4. Check whether f is a factor */ 
/* 5. If yes, write f to answer */ 
/* 6. Increment f appropriately */ 

while(f < limit) 
{ 
    if(checkFactor(product,f)) 
    { 
     result = &f; 
    } 
    f += numThreads; 
} 

} 

long long factor (long long product) 
{ 
if (product % 2 == 0) 
{ 
    return 2; 
} 
long long limit = (long long) sqrt ((double) product); 

long long result = 1; 
long long *dResult; 

/******************/ 
/* Your code here */ 
/******************/ 
dim3 gridDim(256);  /* Create 256 blocks */ 
dim3 blockDim(256);  /* Create 256 threads per block */ 

/* 1. Allocate memory for dResult */ 
cudaMalloc((void**) &dResult, sizeof(dResult)); 

/* 2. Memcpy result into dResult */ 
cudaMemcpy(dResult, &result, sizeof(result), cudaMemcpyHostToDevice); 

/* 3. Launch the kernel    */ 
factorKernel<<<gridDim, blockDim>>>(product, limit, dResult); 

/* 4. Memcpy dResult back to result */ 
cudaMemcpy(&result, dResult, sizeof(dResult), cudaMemcpyDeviceToHost); 

/* 5. Free dResult     */ 
cudaFree(dResult); 

return result; 
} 

int main (int argc, char **argv) 
{ 
long long product = atoll (argv [1]); /* convert arguement to long long */ 
long long f = factor (product);  /* call the factor function */ 

if (f == 1) 
{ 
    printf ("%ld is a prime number.\n", product); 
} 
else 
{ 
    printf ("%ld has a prime factor of %ld.\n", product, f); 
} 
return 0; 
} 

このプログラムでは、threadIdx.xが計算された制限内にあるかどうかを確認します。そうだった場合は、そのthreadIdx.xをcheckFactorに使用します。そのtreadIdx.xが要因だった場合、私は結果をそのthreadIdx.xに等しく設定したいと思っていました。

コンパイルNVCC -o pfactor pfactor.cu

実行場所:./pfactor 11010010001

期待される結果:23

実際〜プログラムは、私がなぜプログラムdoesntのを確認していない

ハングアップ実行を停止します。

+0

"なぜプログラムが動作しなくなったのかわかりません。" 'blockIdx.x * blockDim.x;'はあなたにスレッドの数を与えません。あなたが立ち上げるブロックの1つに 'blockIdx.x'の値が0(常に)になります。それについて考えてみてください。グリッドストライドループを使用しようとしているようです。 'f = threadIdx.x + blockDim.x * blockIdx.x'を設定し、' numThreads = gridDim.x * blockDim.x; 'を設定します。そして、あなたはその答えを提案する必要があります。そして、私はこのコードのすべての問題を修正すると言っているわけではありません。 –

答えて

1

なぜ結果をfへの参照に設定していますか? &fは、fのアドレスにresultを設定します。これはあなたが望むものではありません。

スイッチ:

result = &f; 

へ:

*result = f; 

あなたが その他の一般的な質問(argv[1]に反対?)argv [0]を意味するものではありません。よろしいです、あなたはCUDAの例をコンパイルすることができますか?

+0

私はresult = fを設定しようとしましたが、コンパイルできませんでした。そのエラーは、 "long long"で設定できない "type" long longの行に沿ったエラーでした。 "argv [1] ./pfactor 11010010001. – Juscallmesteve

+0

エラー: "long long *"型の値に "long long *"型のエンティティを割り当てることはできません – Juscallmesteve

+0

argv [0]は本質的に "pfactor"と言っていますが、argv [1]は数字です – Juscallmesteve

関連する問題