C++ 11 の機能であるランダム ライブラリを使用する C++ プログラムを変換しようとしています。ここで同様の投稿をいくつか読んだ後、コードを 3 つのファイルに分けてみました。最初に、私は C/C++ にあまり精通しておらず、仕事では主に R を使用していると言いたいと思います。
メインファイルは次のようになります。
#ifndef _KERNEL_SUPPORT_
#define _KERNEL_SUPPORT_
#include <complex>
#include <random>
#include <iostream>
#include "my_code_header.h"
using namespace std;
std::default_random_engine generator;
std::normal_distribution<double> distribution(0.0,1.0);
const int rand_mat_length = 24561;
double rand_mat[rand_mat_length];// = {0};
void create_std_norm(){
for(int i = 0 ; i < rand_mat_length ; i++)
::rand_mat[i] = distribution(generator);
}
.
.
.
int main(void)
{
...
...
call_global();
return 0;
}
#endif
ヘッダーファイルは次のようになります。
#ifndef mykernel_h
#define mykernel_h
void call_global();
void two_d_example(double *a, double *b, double *my_result, size_t length, size_t width);
#endif
.cu ファイルは次のようになります。
#ifndef _MY_KERNEL_
#define _MY_KERNEL_
#include <iostream>
#include "my_code_header.h"
#define TILE_WIDTH 8
using namespace std;
__global__ void two_d_example(double *a, double *b, double *my_result, size_t length, size_t width)
{
unsigned int row = blockIdx.y*blockDim.y + threadIdx.y;
unsigned int col = blockIdx.x*blockDim.x + threadIdx.x;
if ((row>length) || (col>width)) {
return;
}
...
}
void call_global()
{
const size_t imageLength = 528;
const size_t imageWidth = 528;
const dim3 threadsPerBlock(TILE_WIDTH,TILE_WIDTH);
const dim3 numBlocks(((imageLength) / threadsPerBlock.x), ((imageWidth) / threadsPerBlock.y));
double *d_a, *d_b, *mys ;
...
cudaMalloc((void**)&d_a, sizeof(double) * imageLength);
cudaMalloc((void**)&d_b, sizeof(double) * imageWidth);
cudaMalloc((void**)&mys, sizeof(double) * imageLength * imageWidth);
two_d_example<<<numBlocks,threadsPerBlock>>>(d_a, d_b, mys, imageLength, imageWidth);
...
cudaFree(d_a);
cudaFree(d_b);
}
#endif
__global__
g ++でコンパイルされているために次のエラーが発生したため、.hから削除されたことに注意してください。
In file included from my_code_main.cpp:12:0:
my_code_header.h:5:1: error: ‘__global__’ does not name a type
nvcc で .cu ファイルをコンパイルすると、問題なく my_code_kernel.o が生成されます。しかし、.cpp で C++11 を使用しているため、g++ でコンパイルしようとすると、次のエラーが発生します。
/tmp/ccR2rXzf.o: In function `main':
my_code_main.cpp:(.text+0x1c4): undefined reference to `call_global()'
collect2: ld returned 1 exit status
これはCUDA自体では何もする必要がなく、両方の場所にヘッダーを含めることの間違った使い方かもしれないことを理解しています. また、my_code_kernel.o と my_code_main.o (できれば) をコンパイルし、最も重要なことにリンクする正しい方法は何ですか? この質問があまりにも些細なことでしたら申し訳ありません!