在CUDA内核中执行后选择所选元素
我正在尝试在CUDA中转换以下c代码。。。。 在下面的代码中,我得到了元素数组[12,13,23,24,25]。。。 我希望输出像[1232342345]。。 您将通过查看代码获得逻辑在CUDA内核中执行后选择所选元素,c,cuda,C,Cuda,我正在尝试在CUDA中转换以下c代码。。。。 在下面的代码中,我得到了元素数组[12,13,23,24,25]。。。 我希望输出像[1232342345]。。 您将通过查看代码获得逻辑 #include <stdio.h> #define N 5 int main(){ int i,j; int array[N] = { 12, 13, 23, 24, 25}; int new_array[(N-1)*N/2] = { 0 }; int k=0; for ( i = 0; i
#include <stdio.h>
#define N 5
int main(){
int i,j;
int array[N] = { 12, 13, 23, 24, 25};
int new_array[(N-1)*N/2] = { 0 };
int k=0;
for ( i = 0; i < N; i++)
for( j = i+1; j < N; j++)
{
if((array[i]-array[i]%10) == (array[j]-array[j]%10))
{
new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;
k++;
}
}
for ( i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
return 0;
}
#包括
#定义n5
int main(){
int i,j;
int数组[N]={12,13,23,24,25};
int新_数组[(N-1)*N/2]={0};
int k=0;
对于(i=0;i
现在问题来了,当我尝试转换成CUDA内核。。。
我在输出中得到了一些东西,但我不知道如何选择选择性元素并将其存储在数组中
#include <stdio.h>
#define N 5
__global__ void kernel(int* new_array_d, int* array_d) {
int i = threadIdx.x;
int j = threadIdx.y;
if (j > i && (array_d[i]-(array_d[i]%10)) == (array_d[j]-(array_d[j]%10)))
new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + (array_d[j]%10);
}
int main(){
int array[N] = { 12, 13, 23, 24, 25};
int new_array[N-1)*N/2] = { 0 };
int* array_d; cudaMalloc((void**)&array_d,N*sizeof(int));
int* new_array_d; cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int));
cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice);
dim3 grid(1,1);
dim3 block(N,N);
kernel<<<grid,block>>>(new_array_d,array_d);
cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost);
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
return 0;
}
#包括
#定义n5
__全局无效内核(int*新数组,int*数组){
int i=threadIdx.x;
int j=螺纹内径x.y;
如果(j>i&(array_d[i]-(array_d[i]%10))==(array_d[j]-(array_d[j]%10)))
新的数组d[i*N+(j-(i+1))-(i)*(i+1)/2]=数组d[i]*10+(数组d[j]%10);
}
int main(){
int数组[N]={12,13,23,24,25};
int新_数组[N-1)*N/2]={0};
int*array_d;cudamaloc((void**)和array_d,N*sizeof(int));
int*新数组;cudamaloc((void**)和新数组(N-1)*N/2*大小(int));
cudaMemcpy(数组,数组,N*sizeof(int),cudaMemcpyHostToDevice);
dim3网格(1,1);
dim3块(N,N);
内核(新的数组d,数组d);
cudaMemcpy(新数组,新数组,N-1)*N/2*sizeof(int),cudamemcpydevicetoost);
对于(int i=0;i<(N-1)*N/2;i++)printf(“新_数组[%d]=%d\N”,i,新_数组[i]);
返回0;
}
我应该尝试不同的索引还是只在CPU上进行。。。??
请帮帮我。。。
提前通知
请注意:
我试着把元素12和13组合起来,只有当除了单位位置之外的数字是相同的。。。
12和13…(共有1个)…做12*10+(13%10)=123
23和25…(共有2个)…do 23*10+(25%10)=235…除了上面评论中报告的编译问题外,您的代码似乎没有显示任何逻辑问题。您正在观察未设置数组值的不同结果,因为最终数组
new\u array
和new\u array\u d
尚未初始化
您可以通过向代码中添加以下行来解决此问题:
memset(new_array,0,(N-1)*N/2*sizeof(int));
cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int));
#include <stdio.h>
#define N 7
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
__global__ void kernel(int* new_array_d, int* array_d) {
int i = threadIdx.x;
int j = threadIdx.y;
if ((j > i) && ((array_d[i]-(array_d[i]%10)) == (array_d[j]-(array_d[j]%10))))
new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + (array_d[j]%10);
}
int main(){
int array[N] = { 12, 13, 23, 24, 25, 32, 33};
int new_array[(N-1)*N/2] = { 0 };
int* array_d; cudaMalloc((void**)&array_d,N*sizeof(int));
int* new_array_d; cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int));
memset(new_array,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int)));
gpuErrchk(cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice));
for (int i = 0; i < N; i++)
for(int j = i+1; j < N; j++)
{
if((array[i]-array[i]%10) == (array[j]-array[j]%10))
new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;
}
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
printf("\n\n");
dim3 grid(1,1);
dim3 block(N,N);
kernel<<<grid,block>>>(new_array_d,array_d);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
gpuErrchk(cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost));
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
getchar();
return 0;
}
为了您的方便,我在下面报告完整的代码以及初始化和CUDA错误检查,这是您在代码中忽略的一个重要方面:
memset(new_array,0,(N-1)*N/2*sizeof(int));
cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int));
#include <stdio.h>
#define N 7
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) exit(code);
}
}
__global__ void kernel(int* new_array_d, int* array_d) {
int i = threadIdx.x;
int j = threadIdx.y;
if ((j > i) && ((array_d[i]-(array_d[i]%10)) == (array_d[j]-(array_d[j]%10))))
new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + (array_d[j]%10);
}
int main(){
int array[N] = { 12, 13, 23, 24, 25, 32, 33};
int new_array[(N-1)*N/2] = { 0 };
int* array_d; cudaMalloc((void**)&array_d,N*sizeof(int));
int* new_array_d; cudaMalloc((void**)&new_array_d,(N-1)*N/2*sizeof(int));
memset(new_array,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemset(new_array_d, 0, (N-1)*N/2*sizeof(int)));
gpuErrchk(cudaMemcpy(array_d,array,N*sizeof(int),cudaMemcpyHostToDevice));
for (int i = 0; i < N; i++)
for(int j = i+1; j < N; j++)
{
if((array[i]-array[i]%10) == (array[j]-array[j]%10))
new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j]%10;
}
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
printf("\n\n");
dim3 grid(1,1);
dim3 block(N,N);
kernel<<<grid,block>>>(new_array_d,array_d);
gpuErrchk(cudaPeekAtLastError());
gpuErrchk(cudaDeviceSynchronize());
gpuErrchk(cudaMemcpy(new_array,new_array_d,(N-1)*N/2*sizeof(int),cudaMemcpyDeviceToHost));
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
getchar();
return 0;
}
#包括
#定义n7
#定义gpuerchk(ans){gpuAssert((ans),_文件_,_行__)}
内联void gpuAssert(cudaError\u t代码,char*文件,int行,bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(标准,“GPUassert:%s%s%d\n”,cudaGetErrorString(代码)、文件、行);
如果(中止)退出(代码);
}
}
__全局无效内核(int*新数组,int*数组){
int i=threadIdx.x;
int j=螺纹内径x.y;
如果((j>i)和((数组d[i]-(数组d[i]%10))==(数组d[j]-(数组d[j]%10)))
新的数组d[i*N+(j-(i+1))-(i)*(i+1)/2]=数组d[i]*10+(数组d[j]%10);
}
int main(){
int数组[N]={12,13,23,24,25,32,33};
int新_数组[(N-1)*N/2]={0};
int*array_d;cudamaloc((void**)和array_d,N*sizeof(int));
int*新数组;cudamaloc((void**)和新数组(N-1)*N/2*大小(int));
memset(新的_数组,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemset(新的数组d,0,(N-1)*N/2*sizeof(int));
gpuErrchk(cudaMemcpy(数组d,数组,N*sizeof(int),cudaMemcpyHostToDevice));
对于(int i=0;i
在以前版本的代码中,我的朋友得到了@jackolanten的帮助。我希望你能帮助我…-)如果你要发布代码,至少要努力确保它能编译……是的……我会小心的……谢谢你的帮助suggestion@user3319055你为什么不修改你发布的代码,让它编译呢?您可以编辑自己的问题-单击问题下方的edit
链接。