使用CUDA内核的数组操作
我正在编写CUDA内核,线程正在执行以下任务:使用CUDA内核的数组操作,c,cuda,nvidia,C,Cuda,Nvidia,我正在编写CUDA内核,线程正在执行以下任务: for example i have array of [1, 2, 3, 4] then I want answer [12, 13, 14, 23, 24, 34] 假设我有一个包含n个整数的数组,我有两个索引I和j C语言中的简单解决方案是: k=0; for (i = 0; i < n - 1; i++) for(j = i+1; j < n-1 ; j++) { new_array[k] = array
for example i have array of [1, 2, 3, 4] then I want answer [12, 13, 14, 23, 24, 34]
假设我有一个包含n个整数的数组,我有两个索引I和j
C语言中的简单解决方案是:
k=0;
for (i = 0; i < n - 1; i++)
for(j = i+1; j < n-1 ; j++)
{ new_array[k] = array[i]*10 + array[j];
k++;
}
在CUDA,我尝试了我的运气:
for(i = threadIdx.x + 1; i < n-1; i++ )
new_array[i] = array[threadIdx.x] * 10 + array[i];
但我认为这不是完全正确或最佳的方法。有谁能提出更好的建议吗?我假设您要移植到CUDA的代码如下:
#include <stdio.h>
#define N 7
int main(){
int array[N] = { 1, 2, 3, 4, 5, 6, 7};
int new_array[(N-1)*N/2] = { 0 };
int k=0;
for (int i = 0; i < N; i++)
for(int j = i+1; j < N; j++)
{
new_array[k] = array[i]*10 + array[j];
k++;
}
for (int i = 0; i < (N-1)*N/2; i++) printf("new_array[%d] = %d\n", i, new_array[i]);
return 0;
请添加您自己的CUDA错误检查。此外,您可能希望将上述CUDA代码扩展到非幺正大小的块网格。您描述的上述字符成对串联的问题似乎与for循环所示的问题完全不同。在后一种情况下,您似乎面临一个内部循环的问题。thnanku@jackolanten。我会查出来的。这是你之前发布的问题的重复,现在被删除了。您发布的纯C代码@JackOLantern你能把你的回复作为一个答案吗,我会投赞成票。对上面的代码感到非常抱歉。我改变了一点@RobertCrovella你能再试一次吗。请…为什么不像我一样提供一个完整的代码,包括编译和运行程序所需的所有include文件和一切,并像我一样显示运行程序时的实际结果。同样地,您应该为发布的CUDA代码执行此操作。这表明你在某种程度上理解了你所问的问题,并且具备了所需的一些基本知识。事实上,所以:3.询问代码的问题必须证明对问题的理解是最低限度的。。。
for (int i = 0; i < N; i++)
for(int j = i+1; j < N; j++)
new_array[i*N+(j-(i+1))-(i)*(i+1)/2] = array[i]*10 + array[j];
#include <stdio.h>
#define N 7
__global__ void kernel(int* new_array_d, int* array_d) {
int i = threadIdx.x;
int j = threadIdx.y;
if (j > i) new_array_d[i*N+(j-(i+1))-(i)*(i+1)/2] = array_d[i]*10 + array_d[j];
}
int main(){
int array[N] = { 1, 2, 3, 4, 5, 6, 7};
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;
}