C++ CUDA:模具代码不工作
第一:如果这个话题做得不好,我很抱歉(这是我的第一个话题) 我目前正在努力学习NVIDIA上的GPU计算,但是 我对CUDA的_syncthreads()方法有问题,我认为它不起作用。我尝试在网络上搜索,但没有找到修复方法C++ CUDA:模具代码不工作,c++,cuda,C++,Cuda,第一:如果这个话题做得不好,我很抱歉(这是我的第一个话题) 我目前正在努力学习NVIDIA上的GPU计算,但是 我对CUDA的_syncthreads()方法有问题,我认为它不起作用。我尝试在网络上搜索,但没有找到修复方法 __global__ void stencil_1d(int *in, int *out) { __shared__ int temp[BLOCK_SIZE + 2 * RADIUS]; // Création de la mémoire partagée ave
__global__ void stencil_1d(int *in, int *out) {
__shared__ int temp[BLOCK_SIZE + 2 * RADIUS]; // Création de la mémoire partagée avec tout les threads d'un même block
int gindex = threadIdx.x + blockIdx.x * blockDim.x;
int lindex = threadIdx.x + RADIUS;
/*for (int i = 0; i < N*sizeof(int); i++)
printf("%i ---i=%i \n", in[i], i);*/
// Déplacer les éléments d'entrées sur la mémoire partagée
temp[lindex] = in[gindex];
if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
}
__syncthreads(); // Synchronisation des Threads d'un même Block
int result = 0;
for (int offset = -RADIUS; offset <= RADIUS ; offset++)
result += temp[lindex + offset];
out[gindex] = result;
}
如果忘记了:
定义:
#define N 30
#define THREADS_PER_BLOCK 10
#define BLOCK_SIZE (N/THREADS_PER_BLOCK)
#define RADIUS 3
随机输入代码:
void random_ints(int *var, int n) // Attribue une valeur à toutes le composantes des variables
{
int i;
for (i = 0; i < n; i++)
var[i] = 1;
}
void random_int(int*var,int n)//Attribue une valeurátoutes le composantes des variables
{
int i;
对于(i=0;i
提前感谢您的回答。最初是为教学而设计的;它有一些缺陷
首先,每当您在使用CUDA代码时遇到问题,我建议您使用CUDA memcheck
运行代码(请参阅下面我的CUDA memcheck
使用示例)。如果您在请求他人帮助之前这样做,并在问题中提供错误信息,则可能会帮助他人帮助您
如果您使用cuda memcheck
运行此代码,它将指示在访问全局内存和共享内存时出现错误
块大小
不正确。应将其设置为每个块的线程数
,而不是(每个块的N个线程数)
。看起来您打算用3个块(每个块包含10个线程)运行这个内核,所以我们将使用它if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
应该是:
for(int i=0; i<N; i++)
[gindex-RADIUS]:0中(int i=0;i=RADIUS)的光环前卫街区酒店
temp[lindex+BLOCK_SIZE]=((gindex+BLOCK_SIZE)最初是为教学而设计的,它有一些缺陷
首先,每当您在使用CUDA代码时遇到问题,我建议您使用CUDA memcheck
(请参阅下面我的CUDA memcheck
使用示例)。如果您在向他人寻求帮助之前这样做,并在您的问题中提供错误信息,这可能会帮助他人帮助您
如果您使用cuda memcheck
运行此代码,它将指示在访问全局内存和共享内存时出现错误
您选择的BLOCK\u SIZE
不正确。应将其设置为THREADS\u PER\u BLOCK
,而不是(N/THREADS\u PER\u BLOCK)
。您似乎打算使用3个块(每个块包含10个线程)来运行此内核,因此我们将使用它
这些行将索引超出范围:
if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = in[gindex - RADIUS]; // Récuprère le Halo avant les valeurs du block
temp[lindex + BLOCK_SIZE] = in[gindex + BLOCK_SIZE]; // Récupère le Halo après les valeurs du block
应该是:
for(int i=0; i<N; i++)
[gindex-RADIUS]中的(int i=0;i=RADIUS)的:0;//Récuprère le Halo avant les valeurs du block
温度[lindex+块大小]=((gindex+块大小)如果你能将评论翻译成英语,阅读起来会更容易…请提供完整的代码,我们想知道N
,每个块的线程数
,块大小
,半径
,随机整数
等是什么。提供一个其他人可以编译的代码,无需添加任何内容。“我对任何库中的任何方法都有问题,我认为它不起作用"-这是初学者常见的误解。通常,您使用的任何库/API都可以正常工作-您当然可以是第一个发现问题的人,但这比您不了解如何正确使用库/API要难得多。错误更可能出现在您的代码/您对库的使用中,而不是库中。这不正确:用于(int i=0;iI刚刚更新了帖子,如果您能将评论翻译成英语,那么帖子会更容易阅读…请提供完整的代码,我们想知道N
,每个块的线程数
,块大小
,半径
,随机输入数
等是什么。提供一个其他人可以编译的代码,无需但必须添加任何内容。“我对来自任何库的任何方法都有问题,我认为它不起作用”-这是初学者常见的误解。通常,您使用的任何库/API都可以正常工作-您当然可以是第一个发现问题的人,但这比您不了解如何正确使用库/API要难得多。错误更可能出现在您的代码/您对库的使用中,而不是库中。这不正确:for(int i=0;我刚刚更新了postThx,非常感谢您的帮助,我修复了这些东西并使其工作!非常抱歉我的初学者水平。非常感谢您的帮助,我修复了这些东西并使其工作!非常抱歉我的初学者水平。
$ cat t280.cu
#define N 30
#define THREADS_PER_BLOCK 10
#define BLOCK_SIZE THREADS_PER_BLOCK
#define RADIUS 3
#include <stdio.h>
void random_ints(int *var, int n) // Attribue une valeur à toutes le composantes des variables
{
int i;
for (i = 0; i < n; i++)
var[i] = 1;
}
__global__ void stencil_1d(int *in, int *out) {
__shared__ int temp[BLOCK_SIZE + 2 * RADIUS]; // Création de la mémoire partagée avec tout les threads d'un même block
int gindex = threadIdx.x + blockIdx.x * blockDim.x;
int lindex = threadIdx.x + RADIUS;
/*for (int i = 0; i < N*sizeof(int); i++)
printf("%i ---i=%i \n", in[i], i);*/
// Déplacer les éléments d'entrées sur la mémoire partagée
temp[lindex] = in[gindex];
if (threadIdx.x < RADIUS) {
temp[lindex - RADIUS] = (gindex >= RADIUS)?in[gindex - RADIUS]:0; // Récuprère le Halo avant les valeurs du block
temp[lindex + BLOCK_SIZE] = ((gindex + BLOCK_SIZE)<N)?in[gindex + BLOCK_SIZE]:0; // Récupère le Halo après les valeurs du block
}
__syncthreads(); // Synchronisation des Threads d'un même Block
int result = 0;
for (int offset = -RADIUS; offset <= RADIUS ; offset++)
result += temp[lindex + offset];
out[gindex] = result;
}
int main()
{
int size = N * sizeof(int);
/******************** Utilisation de la fonction GPU stencil_1d ********************/
int *in, *out; // Variable sur la mémoire Host
int *d_in, *d_out; //Variable sur la mémoire Device
// Allocation de la mémore aux variables sur le Device
cudaMalloc((void**)&d_in, size);
cudaMalloc((void**)&d_out, size);
// Allocation de la mémoire aux variables de Host
in = (int*)malloc(size); random_ints(in, N);
out = (int*)malloc(size);
// Copie des valeurs des variables de Host vers Device
cudaMemcpy(d_in, in, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_out, out, size, cudaMemcpyHostToDevice);
// Exécution de la fonction sur le Device (ici 3 Blocks, 10 Threads)
stencil_1d <<<N/THREADS_PER_BLOCK, THREADS_PER_BLOCK>>>(d_in, d_out);
// Récupération de la variable out de Device vers Host
cudaMemcpy(out, d_out, size, cudaMemcpyDeviceToHost);
// Affichage du résultat
for(int i=0; i<N; i++)
printf("%i ---i=%i \n", out[i], i);
// Libération de la mémoire prise par les variables sur Host
free(in); free(out);
// Libération de la mémoire prise par les variables sur le Device
cudaFree(d_in); cudaFree(d_out);
return 0;
}
$ nvcc -o t280 t280.cu
$ cuda-memcheck ./t280
========= CUDA-MEMCHECK
4 ---i=0
5 ---i=1
6 ---i=2
7 ---i=3
7 ---i=4
7 ---i=5
7 ---i=6
7 ---i=7
7 ---i=8
7 ---i=9
7 ---i=10
7 ---i=11
7 ---i=12
7 ---i=13
7 ---i=14
7 ---i=15
7 ---i=16
7 ---i=17
7 ---i=18
7 ---i=19
7 ---i=20
7 ---i=21
7 ---i=22
7 ---i=23
7 ---i=24
7 ---i=25
7 ---i=26
6 ---i=27
5 ---i=28
4 ---i=29
========= ERROR SUMMARY: 0 errors
$