【发布时间】:2017-08-26 14:19:18
【问题描述】:
我想在 GPU 上并行计算一些东西,并在每次内核调用之间显示结果。代码看起来像这样:
void execute(){
runthread = true;
float erg[128 * 2] = {};
float *d_a, *d_b, *d_c, *d_erg;
size_t sizeErg = sizeof(float) * 2 * N;
size_t sizeAB = sizeof(float)*N;
float c[2] = { 1, 2 };
gpuErrchk(cudaMalloc((void**)&d_a, sizeAB));
gpuErrchk(cudaMalloc((void**)&d_b, sizeAB));
gpuErrchk(cudaMalloc((void**)&d_c, sizeof(float) * 2));
gpuErrchk(cudaMalloc((void**)&d_erg, sizeErg));
gpuErrchk(cudaMemcpy(d_a, anode, sizeAB, cudaMemcpyHostToDevice));
gpuErrchk(cudaMemcpy(d_b, kathode, sizeAB, cudaMemcpyHostToDevice));
gpuErrchk(cudaMemcpy(d_c, c, 2 * sizeof(float), cudaMemcpyHostToDevice));
float time = 0;
int i = 0;
while (runthread){
kernel<<<(N * 2) / 64, 64 >>>(d_a, d_b, d_c, d_erg, N);
cudaDeviceSynchronize();
gpuErrchk(cudaMemcpy(erg, d_erg, sizeErg, cudaMemcpyDeviceToHost));
float acc = 0;
for (int j = 0; j < N * 2; j++){
acc += erg[j];
}
std::cout << "Erg" << i << "=" << acc << std::endl;
std::cout << "Kernel Execution took" << time << "ms" << std::endl;
i++;
}
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
cudaFree(d_erg);
}
此函数是具有布尔变量runthread 的类的一部分。我的想法是调用另一个成员函数,它将使用执行函数启动一个新的 CPU 线程,并在主函数中等待,直到用户输入一些内容来调用另一个设置 runthreads = false 的成员函数。所以线程将在下一个内核完成后完成。 我总是从 Visual Studio 收到错误消息。现在我想知道这是否可能,或者 CPU 是否忙于控制 GPU 执行?有人在 GPU 和 CPU 上并行执行多线程方面有经验吗?还是我应该只在 while 循环中查找用户输入?
【问题讨论】:
标签: c++ cuda infinite-loop